Аватар для Deimos_
39 / 38 / 32
Регистрация: 24.11.2014
Сообщений: 352
.NET 4.x

Как работать с коллекцией через Фабричный метод

16.05.2019, 20:25. Показов 2489. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет, я попробовал реализовать Фабричный метод
Вот что получилось
Класс продукт, там 1 абстрактный класс и 2 конкретных
Продукт инструмент

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
76
77
78
79
80
81
82
83
84
85
86
87
88
 abstract class ToolProduct
    {
        private int count;
 
        public ToolProduct() { }
 
        public ToolProduct(string name)
        {
            Name = name;
        }
 
        public ToolProduct(string name,int count)
        {
            Name = name;
            Count = count;
        }
 
        public string Name { get; set; }
 
        public int Count
        {
            get { return count; }
            set { count = (value >= 0) ? value : 0; }
        }
 
        abstract public CreaterTool Create();
    }
 
    class Caliber : ToolProduct
    {
        public Caliber() { }
        /// <summary>
        /// Конструктор детали Калибр
        /// </summary>
        /// <param name="name">Наименование детали</param>
        /// <param name="type">Тип детали предельный,нормальный,регулируемый</param>
        public Caliber(string name, TypeCaliber type):base(name)
        {
            TypeC = type;
        }
 
        public TypeCaliber TypeC  { get; set; }
        internal enum TypeCaliber
        {
            Normal,
            Extreme,
            Controllable
        }
 
        public override CreaterTool Create()
        {
            return new CaliberCreater();
        }
    }
 
    class Clamp : ToolProduct
    {
        public Clamp() { }
        /// <summary>
        /// Конструктор Скобы
        /// </summary>
        /// <param name="name">Наименование скобы</param>
        /// <param name="typesize">Тип размера 0,30,60,90,120,150</param>
        /// <param name="diametrcontrol">Контроль среднего диаметра</param>
        public Clamp(string name,TypeS typesize, bool diametrcontrol):base(name)
        {
            TypeSize = typesize;
            DiametrControl = diametrcontrol;
        }
 
        public bool DiametrControl { get; set; }
 
        public TypeS TypeSize { get; set; }
        internal enum TypeS
        {
            S_0 = 0,
            S_30 = 30,
            S_60 = 60,
            S_90 = 90,
            S_120 = 120,
            S_150 = 150
        }
 
        public override CreaterTool Create()
        {
            return new ClampCreater();
        }
    }


Фабричные методы этих продуктов
Соответственно и тут 1 абстракный класс фабрики и 2 конкретных
Фабричные методы

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
abstract class CreaterTool
    {
        ToolProduct AbstractTool;
 
        public abstract ToolProduct FactoryMethod();
 
        public void AnyOperation()
        {
            AbstractTool = FactoryMethod();
        }
 
    }
 
    class CaliberCreater : CreaterTool
    {
        public override ToolProduct FactoryMethod()
        {
            return new Caliber();
        }
    }
    class ClampCreater : CreaterTool
    {
        public override ToolProduct FactoryMethod()
        {
            return new Clamp();
        }
    }

Что нужно сделать что бы соеденить их в единый класс контейнер где я смогу работать с коллекцией этих
продуктов и делать стандартные операции типа, добавлять продукт, удалять, показать.???
Я не понимаю как их соеденить?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.05.2019, 20:25
Ответы с готовыми решениями:

Как работать с коллекцией objFolder.SubFolders?
Я вывожу список подпапок так: Sub ShowSubFolders(objFolder) If IsObject(objFolder) Then For each Folder in objFolder.SubFolders...

Как реализовать версионность для rest api при посредстве паттерна фабричный метод?
Думаю как красиво написать rest api на php. Пытаюсь реализовать версионность. Вычитал, что надо для каждой версии создавать свою модель при...

Фабричный метод
Добрый вечер. Заранее извиняюсь за создание темы о паттерне в этом разделе (в соответствующем разделе видел похожие темы но для php, в...

10
 Аватар для Deimos_
39 / 38 / 32
Регистрация: 24.11.2014
Сообщений: 352
17.05.2019, 20:10  [ТС]
Какой смысл в этих шаблонах если в конечном итоге добавляется абстракный обьект и у тебя нету доступа к полям конкретного класса !
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
17.05.2019, 20:52
Цитата Сообщение от Deimos_ Посмотреть сообщение
и у тебя нету доступа к полям конкретного класса !
в этом собственно и смысл.
допустим я заказал на фабрике монитор (такая штука, которую втыкаешь в розетку и hdmi и она показывает картинку)
две разные фабрики прислали мне 2 разных монитора, оба имеют HDMI, но один с дополнительным VGA разъемом, а другой с DisplayPort.
теперь я хочу использовать монитор - я втыкаю HDMI и готово. знать не знаю что за VGA и DisplayPort, да и не нужны они были

ну и пара замечаний к реализации:
Цитата Сообщение от Deimos_ Посмотреть сообщение
abstract public CreaterTool Create();
сами классы не должны производить фабрики.
Это как попытаться из спичечного коробка достать завод по производству спичек

Цитата Сообщение от Deimos_ Посмотреть сообщение
public void AnyOperation()
* * * * {
* * * * * * AbstractTool = FactoryMethod();
* * * * }
это непонятно зачем, да и не используется в коде
1
 Аватар для Deimos_
39 / 38 / 32
Регистрация: 24.11.2014
Сообщений: 352
17.05.2019, 21:19  [ТС]
Цитата Сообщение от КОП Посмотреть сообщение
это непонятно зачем, да и не используется в коде
Это мне с ITVDN курса сказали я и прилепили у себя хотя зачем я х3

Добавлено через 11 минут
Я переделал немного фабрику и убрал с классов метод Create()
Хорошо как мне тогда реализовать методы с разными параметрами если он ругается что не определен
абстрактный метод CreateTool(); без параметров в abstract class CreaterTool

Фабрика инструментов

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
abstract class CreaterTool
    {
        public abstract ToolProduct CreateTool();
    }
 
    class CaliberCreater : CreaterTool
    {
        public  ToolProduct CreateTool(string name,string type)
        {
            return new Caliber(name,type);
        }
    }
    class ClampCreater : CreaterTool
    {
        public ToolProduct CreateTool(string name,Clamp.TypeS typeS,bool diametrcontrol)
        {
            return new Clamp(name, typeS, diametrcontrol);
        }
    }


Классы

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
 abstract class ToolProduct
    {
        private int count;
 
        public ToolProduct() { }
 
        public ToolProduct(string name)
        {
            Name = name;
        }
 
        public string Name { get; set; }
 
        public int Count
        {
            get { return count; }
            set { count = (value >= 0) ? value : 0; }
        }
    }
 
    class Caliber : ToolProduct
    {
        public Caliber() { }
        /// <summary>
        /// Конструктор детали Калибр
        /// </summary>
        /// <param name="name">Наименование детали</param>
        /// <param name="type">Тип детали предельный,нормальный,регулируемый</param>
        public Caliber(string name, string type):base(name)
        {
            TypeC = type;
        }
 
        public string TypeC  { get; set; }
 
    }
 
    class Clamp : ToolProduct
    {
        public Clamp() { }
        /// <summary>
        /// Конструктор Скобы
        /// </summary>
        /// <param name="name">Наименование скобы</param>
        /// <param name="typesize">Тип размера 0,30,60,90,120,150</param>
        /// <param name="diametrcontrol">Контроль среднего диаметра</param>
        public Clamp(string name,TypeS typesize, bool diametrcontrol = false):base(name)
        {
            TypeSize = typesize;
            DiametrControl = diametrcontrol;
        }
 
        public bool DiametrControl { get; set; }
 
        public TypeS TypeSize { get; set; }
        internal enum TypeS
        {
            S_0 = 0,
            S_30 = 30,
            S_60 = 60,
            S_90 = 90,
            S_120 = 120,
            S_150 = 150
        }
    }


Добавлено через 6 минут
Класс контейнер в который я пытаюсь реализовать интерфейс добавления
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 class ToolCollection
    {
        Dictionary<string, ToolProduct> ToolDictonaryProduct;
        List<ToolProduct> ToolListProduct;
 
        ToolCollection()
        {
            ToolListProduct = new List<ToolProduct>();
        }
 
        public void Add(string CreaterName)
        {
            switch(CreaterName)
            {
                case "Калибр":
                    CreaterTool creater = new CaliberCreater();
                    ToolProduct product = creater.CreateTool();//Куда параметры втыкать если в абстрактном их нету
                    break;
            }
           
        }
    }
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
17.05.2019, 21:32
Цитата Сообщение от Deimos_ Посмотреть сообщение
Хорошо как мне тогда реализовать методы с разными параметрами если он ругается что не определен
то что вы делаете фабрикой не является. нельзя менять сигнатуру CreateTool, иначе, как сами видите, параметры не передать.

Сама постановка задачи не позволит вам это сделать. Нельзя на одной фабрике производить скобы и калибры одновременно, это разные детали.
1
 Аватар для Deimos_
39 / 38 / 32
Регистрация: 24.11.2014
Сообщений: 352
17.05.2019, 21:36  [ТС]
Хорошо но я пересмотрел все остальные шаблоны Builder,Abstract Factory, Prototype да я знаю все они основаны на Factory Method и из всех них мне показалось что Factory Method больше всего подходит под мою задачу
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
17.05.2019, 21:37
можно переделать в таком направлении:
создать фабрику скоб. От нее создать по фабрике для каждого типа размера. В итоге получится метод
C#
1
CreateClamp(string name, bool diameterControl
а какой размер скобы, так это смотря у какой фабрики ее попросить.

Добавлено через 1 минуту
Цитата Сообщение от Deimos_ Посмотреть сообщение
больше всего подходит под мою задачу
задача не была озвучена в теме. Опишите задачу - можно будет придумать решение.
а так мы пытаемся модифицировать микроскоп для забивания гвоздей. Успех сей операции предсказуем
1
 Аватар для Deimos_
39 / 38 / 32
Регистрация: 24.11.2014
Сообщений: 352
17.05.2019, 21:45  [ТС]
Цитата Сообщение от КОП Посмотреть сообщение
можно будет придумать решение
Есть 5 инструментов и мне нужно с ними работать
В таблице для примера в DataGrid в UI - добавлять/удалять/изменять/показать их.
Code
1
Калибр, Скобы, Пробки,Резьбовые Кольца,  шаблоны.
я решил их унаследовать от одного класса Инструменты.
А дальше пошло поехало как видите.
Решил по нормальному сделать а в результате сижу уже 2ой день по 8 часов изучаю эти патерны и их релизации на ютубе и метаните и курсов ITVDN.

Не по теме:

Чувствю себя дибилом и бешусь из за этого.
Паттерн FlyWeight = вообще жесть какая та!

0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
17.05.2019, 22:25
Лучший ответ Сообщение было отмечено Deimos_ как решение

Решение

Цитата Сообщение от Deimos_ Посмотреть сообщение
В таблице для примера в DataGrid
слабо представляю, как организовать разные типы элементов красиво. Общие свойства в общих колонках, но как вы хотите уникальные сделать, могу только гадать

Цитата Сообщение от Deimos_ Посмотреть сообщение
добавлять
условно есть 5 кнопок, каждая выводит отдельную форму с соответствующими полями и возвращает созданный объект.

можно изощриться до умных динамических форм, но не уверен что это нужно

Цитата Сообщение от Deimos_ Посмотреть сообщение
удалять
по текущему id в таблице удаляем из листа, не должно быть сложно.

Цитата Сообщение от Deimos_ Посмотреть сообщение
изменять/показать их.
допустим в таблице только общие свойства, можно по двойному клику показывать конкретный view с данными текущего инструмента, которые можно заодно и изменить.


PS: это лишь пример моего смутного видения задачи, у вас оно более полное, так что смотрите по ситуации.
1
 Аватар для Deimos_
39 / 38 / 32
Регистрация: 24.11.2014
Сообщений: 352
17.05.2019, 22:28  [ТС]
ну придется делать я так понял 5 таблиц для каждого обьекта тогда на??ер эти паттерны по старинке сделаю через списки и все.
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
17.05.2019, 22:41
Deimos_, у каждого паттерна самая важная часть это условия, когда его нужно или не нужно применять. В данном случае они не выполняются. Фабрика точно не про объединение разных элементов в одной таблице.

Ее можно притянуть для создания новых объектов. Тогда в методе createTool можно вызвать соответствующий вью для создаваемого объекта и возвращать как инструмент. Но с какого-то момента это звучит как паттерн ради паттерна
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.05.2019, 22:41
Помогаю со студенческими работами здесь

Паттерн фабричный метод
Нужно в C# привести пример работы паттерна фабричный метод. Выручайте, желательно готовый код, чтобы копипастом работало все. Нету...

Фабричный метод и RAII
У меня возник вопрос, как реализовать фабричный метод чтобы он соответствовал идиомы raii. Кто в данном случае является ответственным за...

Фабричный метод и паттерн фабрика
подскажите в чем разница увидел пример фабричного метода не понял его public MyClass Factory(int i, int j) { MyClass t =...

Фабричный метод: для чего он нужен?
Допустим есть такой код: #include &lt;iostream&gt; using std::cout; class Nature{ public: virtual void info() = 0; ...

Отличие паттернов Фабричный метод и Абстрактная фабрика
Правильно ли я понимаю, что отличие паттернов Фабричный метод и Абстрактная фабрика заключается в том, что в последнем присутствует тип,...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

Новые блоги и статьи
JWT аутентификация в ASP.NET Core
UnmanagedCoder 18.06.2025
Разрабатывая веб-приложения, я постоянно сталкиваюсь с дилеммой: как обеспечить надежную аутентификацию пользователей без ущерба для производительности и масштабируемости? Классические подходы на. . .
Краткий курс по С#
aaLeXAA 18.06.2025
Здесь вы найдете все необходимые функции чтоб написать програму на C# Задание 1: КЛАСС FORM 1 public partial class Form1 : Form { Spisok listin = new Spisok(); . . .
50 самых полезных примеров кода Python для частых задач
py-thonny 17.06.2025
Эффективность работы разработчика часто измеряется не количеством написаных строк, а скоростью решения задач. Готовые сниппеты значительно ускоряют разработку, помогают избежать типичных ошибок и. . .
C# и продвинутые приемы работы с БД
stackOverflow 17.06.2025
Каждый . NET разработчик рано или поздно сталкивается с ситуацией, когда привычные методы работы с базами данных превращаются в источник бессонных ночей. Я сам неоднократно попадал в такие ситуации,. . .
Angular: Вопросы и ответы на собеседовании
Reangularity 15.06.2025
Готовишься к техническому интервью по Angular? Я собрал самые распространенные вопросы, с которыми сталкиваются разработчики на собеседованиях в этом году. От базовых концепций до продвинутых. . .
Архитектура Onion в ASP.NET Core MVC
stackOverflow 15.06.2025
Что такое эта "луковая" архитектура? Термин предложил Джеффри Палермо (Jeffrey Palermo) в 2008 году, и с тех пор подход только набирал обороты. Суть проста - представьте себе лук с его. . .
Unity 4D
GameUnited 13.06.2025
Четырехмерное пространство. . . Звучит как что-то из научной фантастики, правда? Однако для меня, как разработчика со стажем в игровой индустрии, четвертое измерение давно перестало быть абстракцией из. . .
SSE (Server-Sent Events) в ASP.NET Core и .NET 10
UnmanagedCoder 13.06.2025
Кажется, Microsoft снова подкинула нам интересную фичу в новой версии фреймворка. Работая с превью . NET 10, я наткнулся на нативную поддержку Server-Sent Events (SSE) в ASP. NET Core Minimal APIs. Эта. . .
С днём независимости России!
Hrethgir 13.06.2025
Решил побеседовать, с утра праздничного дня, с LM о завоеваниях. То что она написала о народе, представителем которого я являюсь сам сначала возмутило меня, но дальше только смешило. Это чисто. . .
Лето вокруг.
kumehtar 13.06.2025
Лето вокруг. Наполненное бурями и ураганами событий. На фоне магии Жизни, священной и вечной, неумелой рукой человека рисуется панорама душевного непокоя. Странные серые краски проникают и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru