Skip to content

Instantly share code, notes, and snippets.

@sunmeat
Created November 24, 2023 14:04
Show Gist options
  • Save sunmeat/3b385fdce228ac9ecd1c462ccbc70468 to your computer and use it in GitHub Desktop.
Save sunmeat/3b385fdce228ac9ecd1c462ccbc70468 to your computer and use it in GitHub Desktop.
factory method C# example
// Абстрактный класс для продуктов-диалогов
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