Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 23.11.2021
Сообщений: 35
.NET 6

Реализация сервиса программы через Singleton (Одиночка)

09.05.2022, 00:27. Показов 938. Ответов 9

Студворк — интернет-сервис помощи студентам
Здраствуйте. помогите до делать, уже сижу пару дней, и не понимаю, что и как сделать.
Суть программы такова: Нам нужно сделать программу подобие SmartTV, что-бы пользователь мог открыть приложение которое есть в списку, и затем, что-бы открыть другое ему нужно, закрыть предыдущее. Пробовал по разному сделать и вот лучший вариант з того, что у меня получилось. Ноо оно почему-то не работает так как задумано, помогите пожалуйста.
Вот код:

Класс Program:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using L6;
 
namespace L6
{
    class Program
    {
        public static void Main()
        {
            int userChoice;
            Console.WriteLine("SmartTV");
            Applications app = new Applications("YouTube", "Chrome", "MovieOnline");
            Console.WriteLine("You choise type: 1 - YouTube , 2 - Chrome , 3 - MovieOnline.");
            do
            {                
                userChoice = Convert.ToInt32(Console.ReadLine());                
                if (userChoice == 1)
                {
                    app.YouTubeOpen();
                }
                else if (userChoice == 2)
                {
                    app.ChromeOpen();
                }
                else if (userChoice == 3)
                {
                    app.MovieOnlineOpen();
                }
                else if (userChoice == 11)
                {
                    app.YoutubeClose();
                }
                else if (userChoice == 12)
                {
                    app.ChromeClose();
                }
                else if (userChoice == 13)
                {
                    app.MovieOnlineClose();
                }
                else
                {
                    return;
                }
            } while (true);            
        }
    }
}
Класс SmartTV:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using L6;
 
namespace L6
{
    public class SmartTV
    {
        private SmartTV()
        {
            
        }
        private static SmartTV istance;
        private static readonly object instanceLock = new object();
        public static SmartTV GetInstance()
        {
            lock (instanceLock)
            {
                if (istance == null)
                {
                    istance = new SmartTV();
                }
            }
            return istance;
        }
        public void applications(String message)
        {
            Console.WriteLine("|Аpplications| " + message);
        }
    }
}
Класс Applications:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using L6;
 
namespace L6
{
    class Applications
    {        
        private string YouTube;
        private string Chrome;
        private string MovieOnline;
 
        public Applications(string youtube, string chrome, string movieOnline)
        {
            YouTube = youtube;
            Chrome = chrome;
            MovieOnline = movieOnline;
 
        }
        SmartTV APP = SmartTV.GetInstance();
        public void YouTubeOpen()
        {
            SmartTV.GetInstance().applications(
            "Open the program: " + YouTube);
 
            APP.applications("The program is open");
            APP.applications("Exit the YouTube - 11\n");
 
        }
        public void ChromeOpen()
        {
            SmartTV.GetInstance().applications(
            "Open the program: " + Chrome);
 
            APP.applications("The program is open");
            APP.applications("Exit the Chrome - 12\n");
        }
 
        public void MovieOnlineOpen()
        {
            SmartTV.GetInstance().applications(
            "Open the program: " + MovieOnline);
 
            APP.applications("The program is open");
            APP.applications("Exit the MovieOnline - 13\n");
        }
        
        public void YoutubeClose()
        {
            SmartTV.GetInstance().applications(
            "Closing the program: " + YouTube);
 
            APP.applications("Program closed\n");
 
        }
 
        public void ChromeClose()
        {
            SmartTV.GetInstance().applications(
            "Closing  the program: " + Chrome);
 
            APP.applications("Program closed\n");
        }
 
        public void MovieOnlineClose()
        {
            SmartTV.GetInstance().applications(
            "Closing  the program: " + MovieOnline);
 
            APP.applications("Program closed\n");
        }
    }
}
Буду очень благодарен!!!
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.05.2022, 00:27
Ответы с готовыми решениями:

Singleton. Одиночка. Паттерн
Как реализовать паттерн Singleton на C++? Делаю так: Заголовочный файл: class Play { private: Play(void); ~Play(void);

Паттерн Singleton (Одиночка)
Всем привет. Вопрос состоит в том что паттерн находится в трейте trait SingletonTrait { private static $_instance; ...

Реализация клиента веб сервиса через защищённый протокол
Народ помогите с реализацией кода клиента веб-сервиса через защищенный протокол. В наличае есть два сертификата и два приватных ключа. ...

9
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
09.05.2022, 12:19
Цитата Сообщение от jerzy_all Посмотреть сообщение
Класс SmartTV:
Какова функция этого класса?
В нём же нет ни одного члена.

Добавьте в него список допустимых приложений.
Методы закрытия и открытия выбранного или указанного приложения.
В методе открытия сначала проверяйте есть ли в текущий момент другое открытое.
0
0 / 0 / 0
Регистрация: 23.11.2021
Сообщений: 35
09.05.2022, 12:30  [ТС]
Таксс - смотрите уже доделал не много, крч что у меня выходит:

Переписал немного класс SmartTV:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using L6;
 
namespace L6
{
    public class SmartTV
    {
        
        private SmartTV()
        {
            
        }
 
        public SmartTV(string name)
        {
            Name = name;
        }
 
        private static SmartTV instance = null;
        private static readonly object instanceLock = new object();
        public static SmartTV GetInstance(string name)
        {
 
            if(instance == null)
            {
                lock (instanceLock)
                {
                    instance = new SmartTV();
                    instance.Name = name;
                }
            }
            return instance;
        }
 
        public string Name { get; set; }
        
    }
}
Иии доработал класc Applicaishn:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using L6;
 
namespace L6
{
    class Applications
    {
        private string YouTube;
        private string Chrome;
        private string MovieOnline;
        
 
        public Applications(string youtube, string chrome, string movieOnline)
        {
            YouTube = youtube;
            Chrome = chrome;
            MovieOnline = movieOnline;
        }
        //SmartTV APP = SmartTV.GetInstance();
        public string app { get; set; }
        public void YouTubeOpen()
        {
            Thread threadYouTube = new Thread(() =>
            {
                applications("Open the program: " + YouTube + "\nThe program is open \nExit the YouTube - 11\n");
            });
            threadYouTube.Start();
            threadYouTube.Join();
            
        }
        public void ChromeOpen()
        {
            Thread threadChrome = new Thread(() =>
            {
                applications("Open the program: " + Chrome +"\nThe program is open \nExit the Chrome - 11\n");
            });
            threadChrome.Start();
            threadChrome.Join();
        }
 
        public void MovieOnlineOpen()
        {
            Thread threadMovieOnline = new Thread(() =>
            {
                applications("Open the program: " + MovieOnline + "\nThe program is open \nExit the MovieOnline - 11\n");
            });
            threadMovieOnline.Start();
            threadMovieOnline.Join();
        }
          
        public void YoutubeClose()
            {
 
 
            }
 
        public void ChromeClose()
        {
            
        }
 
        public void MovieOnlineClose()
        {
            
        }
        public void applications(String name)
        {
            SmartTV smartTV = SmartTV.GetInstance(name);
            Console.WriteLine("|Аpplications| " + smartTV.Name);
        }
    }
}
Добавлено через 3 минуты
В классе SmartTV прописываю instaсе
как туда записывать
сейчас надо до работать и как раз до писать проверку, есть там данние или нет

Добавлено через 25 секунд
В классе SmartTV прописываю instaсе
как туда записывать, сейчас надо до работать и как раз до писать проверку, есть там данные или нет
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
09.05.2022, 12:30
Цитата Сообщение от jerzy_all Посмотреть сообщение
Переписал немного класс SmartTV:
И какова функция этого класса?
Хранение одного стринга?
Так сделайте тогда просто static string поле.

В той реализации что у вас, класс SmartTV абсолютно бессмыслен.
0
0 / 0 / 0
Регистрация: 23.11.2021
Сообщений: 35
09.05.2022, 12:39  [ТС]
Да сохранение одного string

Добавлено через 6 минут
Да, может быть бесполезен, просто сейчас по предмету проходим данную тему и надо научится его использовать.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
09.05.2022, 13:54
Лучший ответ Сообщение было отмечено jerzy_all как решение

Решение

Цитата Сообщение от jerzy_all Посмотреть сообщение
сейчас по предмету проходим данную тему и надо научится его использовать.
Может вам нужно что-то наподобие такого:
C#
1
2
3
4
5
6
7
8
9
10
11
namespace L6
{
    public class Application
    {
        public Application(string appName)
        {
            AppName = appName ?? throw new ArgumentNullException(nameof(appName));
        }
        public string AppName { get; }
    }
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
using System.Diagnostics.CodeAnalysis;
 
namespace L6
{
    /// <summary>Компаратор для класса <see cref="Application"/></summary>
    public class ApplicationComparer : IEqualityComparer<Application>
    {
        public bool Equals(Application? x, Application? y)
            => x?.AppName == y?.AppName;
 
        public int GetHashCode([DisallowNull] Application app)
            => string.GetHashCode(app?.AppName);
 
        private ApplicationComparer() { }
 
        /// <summary>Синглтон компаратора.</summary>
        public static ApplicationComparer Instance { get; } = new ApplicationComparer();
    }
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
using static System.Console;
 
namespace L6
{
    public class SmartTV
    {
        private SmartTV() { }
 
        /// <summary>Синглтон.</summary>
        public static SmartTV Instance { get; } = new SmartTV();
 
        /// <summary>Множество допустимых приложений.</summary>
        public HashSet<Application> Applications { get; } = new HashSet<Application>(ApplicationComparer.Instance);
 
        /// <summary>Текущеее исполняемое приложение.</summary>
        public Application? CurrentApplication { get; private set; }
 
        /// <summary>Запуск приложения.</summary>
        /// <param name="app">Запускаемое приложение.</param>
        /// <exception cref="ArgumentNullException">Если <paramref name="app"/> = <see langword="null"/>.</exception>
        public void Start(Application app)
        {
            lock (this)
            {
                if (app == null)
                    throw new ArgumentNullException(nameof(app));
 
                if (Applications.Contains(app))
                {
                    WriteLine($"Запуск приложения {app.AppName}");
                    if (CurrentApplication == app)
                        WriteLine("Приложение уже было запущено.");
                    else if (CurrentApplication != null)
                        WriteLine($"Нельзя запустить приложение, так как сейчас исполняется приложение {CurrentApplication.AppName}.");
                    else
                    {
                        CurrentApplication = app;
                        WriteLine("Приложение запущено.");
                    }
                }
                else
                {
                    WriteLine("Такого приложения нет в списке.");
                }
            }
        }
 
        /// <summary>Остановка текущего исполняемого приложения.</summary>
        public void StopCurrentApplication()
        {
            lock (this)
            {
                if (CurrentApplication == null)
                {
                    WriteLine("Нет запущенного приложения.");
                }
                else
                {
                    var app = CurrentApplication;
                    CurrentApplication = null;
                    WriteLine($"Приложение {app.AppName} завершено.");
                }
            }
        }
    }
}
1
0 / 0 / 0
Регистрация: 23.11.2021
Сообщений: 35
09.05.2022, 14:09  [ТС]
Код очень красивый, делает все, что дано в принципе, сделаю маленький косметический ремонт, спасибо.
Очень благодарен за то ,что уделили мне время, если можете подскажите какую-то литературу для чайников
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
09.05.2022, 14:33
Цитата Сообщение от jerzy_all Посмотреть сообщение
если можете подскажите какую-то литературу для чайников
Литература несколько раз обсуждалась в разделе.
В том числе есть и тема в топе раздела.
Я сам не читал книги.
Использовал ProfessorWeb, Metanit и документацию MS.
Сейчас ещё очень часто сморю исходники .Net.
1
0 / 0 / 0
Регистрация: 23.11.2021
Сообщений: 35
09.05.2022, 14:39  [ТС]
Ааа, надо будет зайти в раздел посмотреть, спасибо ещё раз.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
09.05.2022, 14:39
Цитата Сообщение от jerzy_all Посмотреть сообщение
надо будет зайти в раздел посмотреть
Несколько тем:
Литература по C# для начинающих и не только
Сбор мнений о актуальных книгах по C#
Литература для новичков
С чего начать изучение C#?
Книги по C# для начинающего
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.05.2022, 14:39
Помогаю со студенческими работами здесь

Реализация клиента веб-сервиса через защищённый протокол
Народ помогите с реализацией кода клиента веб-сервиса на C# через защищенный протокол. В наличае есть два сертификата и два приватных...

Как для веб сервиса изменить параметр SingleCall на Singleton
Как для веб сервиса(asmx) изменить параметр SingleCall на Singleton, что б на сервере был только один экземпляр класса?

Реализация Singleton
Добрый день, увидел очень странную для себя реализация паттерна Singleton. public sealed class Singleton { ...

Реализация Singleton
Приветствую. Пытался реализовать паттерн проектирования Singleton для лога след. образом: class Logger { public: void...

Реализация паттерна Singleton
Добрый день. Необходимо реализовать класс Storage, объект которого будет единственным в программе. Для достижения данной цели было выбрано...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это дополнительная запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru