Created
November 24, 2023 14:04
-
-
Save sunmeat/3b385fdce228ac9ecd1c462ccbc70468 to your computer and use it in GitHub Desktop.
factory method C# example
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Абстрактный класс для продуктов-диалогов | |
abstract class Dialog | |
{ | |
public abstract void Render(); | |
public abstract void Click(); | |
} | |
// Конкретный продукт диалога для Windows | |
class WindowsDialog : Dialog | |
{ | |
public override void Render() | |
{ | |
Console.WriteLine("Отрисовка Windows-диалога"); | |
} | |
public override void Click() | |
{ | |
Console.WriteLine("Клик на Windows-диалоге"); | |
} | |
} | |
// Конкретный продукт диалога для Web | |
class WebDialog : Dialog | |
{ | |
public override void Render() | |
{ | |
Console.WriteLine("Отрисовка Web-диалога"); | |
} | |
public override void Click() | |
{ | |
Console.WriteLine("Клик на Web-диалоге"); | |
} | |
} | |
// Конкретный продукт диалога для консоли | |
class ConsoleDialog : Dialog | |
{ | |
public override void Render() | |
{ | |
Console.WriteLine("Отрисовка консольного диалога"); | |
} | |
public override void Click() | |
{ | |
Console.WriteLine("Клик на консольном диалоге"); | |
} | |
} | |
// Абстрактный класс для создания продуктов диалогов | |
abstract class DialogFactory | |
{ | |
public abstract Dialog CreateDialog(); | |
} | |
// Конкретная фабрика для создания продуктов диалогов Windows | |
class WindowsDialogFactory : DialogFactory | |
{ | |
public override Dialog CreateDialog() | |
{ | |
return new WindowsDialog(); | |
} | |
} | |
// Конкретная фабрика для создания продуктов диалогов Web | |
class WebDialogFactory : DialogFactory | |
{ | |
public override Dialog CreateDialog() | |
{ | |
return new WebDialog(); | |
} | |
} | |
// Конкретная фабрика для создания продуктов диалогов консоли | |
class ConsoleDialogFactory : DialogFactory | |
{ | |
public override Dialog CreateDialog() | |
{ | |
return new ConsoleDialog(); | |
} | |
} | |
// Клиентский код | |
class Program | |
{ | |
static void Main() | |
{ | |
DialogFactory factory = new WindowsDialogFactory(); | |
Dialog dialog = factory.CreateDialog(); | |
dialog.Render(); | |
dialog.Click(); | |
} | |
} | |
/* | |
Код содержит реализацию паттерна Фабричный метод | |
(Factory Method), который позволяет создавать объекты | |
без указания конкретного класса объекта, который будет | |
создан. | |
Классы WindowsDialog, WebDialog и ConsoleDialog - это | |
конкретные продукты, которые наследуются от абстрактного | |
класса Dialog, представляющего собой продукт-диалог. | |
Каждый продукт реализует методы Render() и Click(), | |
которые выполняют определенные действия в зависимости | |
от конкретной реализации продукта. | |
Классы WindowsDialogFactory, WebDialogFactory и | |
ConsoleDialogFactory - это конкретные фабрики, которые | |
реализуют абстрактный метод CreateDialog() для создания | |
продукта-диалога. Каждая фабрика создает конкретный | |
продукт-диалог соответствующего типа. | |
В клиентском коде создается экземпляр фабрики | |
WindowsDialogFactory, затем вызывается метод | |
CreateDialog(), который создает объект WindowsDialog | |
и возвращает ссылку на него. Далее вызываются методы | |
Render() и Click() у объекта WindowsDialog. | |
Используя этот подход, можно добавлять новые | |
конкретные продукты и фабрики, не изменяя код клиента, | |
а только расширяя базовые абстрактные классы. | |
Это упрощает поддержку и масштабирование кода. | |
*/ | |
// https://refactoring.guru/ru/design-patterns/factory-method | |
/* | |
Фабричный метод — это порождающий паттерн проектирования, | |
который определяет общий интерфейс для создания объектов | |
в суперклассе, позволяя подклассам изменять тип | |
создаваемых объектов. | |
Преимущества и недостатки | |
+ Избавляет класс от привязки к конкретным классам | |
продуктов. | |
+ Выделяет код производства продуктов в одно место, | |
упрощая поддержку кода. | |
+ Упрощает добавление новых продуктов в программу. | |
+ Реализует принцип открытости/закрытости. | |
- Может привести к созданию больших параллельных | |
иерархий классов, так как для каждого класса продукта | |
надо создать свой подкласс создателя. | |
*/ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment