278.78K
Категория: ПрограммированиеПрограммирование

Фабричный метод

1.

Фабричный метод (Factory Method) - это паттерн, который
определяет интерфейс для создания объектов некоторого класса,
но непосредственное решение о том, объект какого класса
создавать происходит в подклассах.
Паттерн следует использовать если
■■ Система не должна зависеть от конкретного типа
создаваемого продукта.
■■
Когда заранее не известен конкретный тип продукта,
который надо создавать.
■■ Конкретные типы создаваемых продуктов необходимо
определять в подклассах.

2.

3.

Абстрактный класс(или интерфейс) Product определяет
интерфейс класса, объекты которого надо создавать.
Конкретный
класс
ConcreteProduct
представляет
реализацию класса Product. Таких классов может быть множество.
Абстрактный класс Creator определяет абстрактный
фабричный метод FactoryMethod(), который возвращает объект
Product.
Конкретный класс ConcreteCreator - наследник класса
Creator, определяющий свою реализацию метода FactoryMethod().
Таких
классов
может
быть
множество,
причем
метод FactoryMethod() каждого отдельного класса-создателя
возвращает определенный конкретный тип продукта.
Для каждого конкретного класса продукта определяется
свой конкретный класс создателя.
Таким образом, класс Creator делегирует создание объекта Product
своим наследникам, которые могут самостоятельно выбирать какой
конкретный тип продукта им создавать.

4.

Реализация шаблона в общем виде
определяется
интерфейс
порождаемых
объектов Product;
базовый класс описывает метод public Product
FabricMethod() для их создания;
наследники переопределяют его, порождая свои
реализации Product;
базовый класс и клиентский код используют в работе
только интерфейс Product, не обращаясь к конкретным
реализациям самостоятельно.

5.

Пример. Написать приложение, позволяющее сохранять
введенный текст в файле в одном из выбранных форматов, а
также читать текст из файла. Реализовать паттерн «Фабричный
метод»

6.

//Интерфейс- абстракция продукта
public interface ITextStorage
{
void Save(string name, string document);
string Load(string name);
}
//реализация продукта
public class OrdinarTextStorage : ITextStorage
{
public void Save(string name, string document)
{
using(StreamWriter writer=new StreamWriter(name))
{
writer.WriteLine(document);
}
}
public string Load(string name)
{
...
}
}

7.

//еще одна реализация продукта
public class SpecialTextSorage : ITextStorage
{
public void Save(string name, string document)
{
document=document.Replace(" ", "\n");
using (StreamWriter writer = new StreamWriter(name))
{
writer.WriteLine(document+"The End");
}
}
public string Load(string name)
{
...
}
}

8.

//Creator
public abstract class DocumentManager
{
public abstract ITextStorage CreateStorage();
public bool Save(string document)
{
try
{
ITextStorage storage = this.CreateStorage();
storage.Save("very_important_file.dat", document);
}
catch
{
return false;
}
return true;
}
}

9.

public class OrdinarDocumentManager : DocumentManager
{
public override ITextStorage CreateStorage()
{
return new OrdinarTextStorage();
}
}
public class SpecialDocumentManager : DocumentManager
{
public override ITextStorage CreateStorage()
{
return new SpecialTextSorage();
}
}

10.

DocumentManager manager;
if (radioButton1.Checked)
{
manager = new OrdinarDocumentManager();
}
else
{
manager = new SpecialDocumentManager();
}
manager.Save(richTextBox1.Text);

11.

12.

Прототип (Prototype) позволяет создавать объекты на основе
уже ранее созданных объектов-прототипов.
То есть по сути данный паттерн предлагает технику
клонирования объектов.
Определяет виды создаваемых объектов с помощью экземплярапрототипа и создает новые объекты путем копирования этого
прототипа

13.

Прототип используют:
Когда конкретный тип создаваемого объекта должен
определяться динамически во время выполнения.
Когда нежелательно создание отдельной иерархии
классов фабрик для создания объектов-продуктов из
параллельной иерархии классов (как, например, при
использовании паттерна Абстрактная фабрика)
Когда
клонирование
объекта
является
более
предпочтительным вариантом нежели его создание и
инициализация с помощью конструктора. Особенно когда
известно, что объект может принимать небольшое
ограниченное число возможных состояний.

14.

Prototype: определяет интерфейс для клонирования самого
себя, который, как правило, представляет метод Clone()
ConcretePrototype1 и ConcretePrototype2: конкретные
реализации прототипа. Реализуют метод Clone()
Client: создает объекты прототипов с помощью
метода Clone()

15.

Структура паттерна на C#
class Client
{
void Operation()
{
Prototype prototype = new ConcretePrototype1(1);
Prototype clone = prototype.Clone();
prototype = new ConcretePrototype2(2);
clone = prototype.Clone();
}
}
abstract class Prototype
{
public int Id { get; private set; }
public Prototype(int id)
{
this.Id = id;
}
public abstract Prototype Clone();
}

16.

class ConcretePrototype1 : Prototype
{
public ConcretePrototype1(int id)
: base(id)
{ }
public override Prototype Clone()
{
return new ConcretePrototype1(Id);
}
}
class ConcretePrototype2 : Prototype
{
public ConcretePrototype2(int id)
: base(id)
{ }
public override Prototype Clone()
{
return new ConcretePrototype2(Id);
}
}

17.

Фабричный метод
Абстрактная фабрика
Строитель
Порождает один
Порождает семейство
объект с
объектов с
определенным
определенными
интерфейсом.
интерфейсами.
Метод класса, который Интерфейс,
переопределяется
реализуемый классами.
потомками.
Создает в несколько
шагов один сложный
(составной) объект.
Скрывает реализацию Скрывает реализацию
объекта.
семейства объектов.
Скрывает процесс
создания объекта,
порождает требуемую
реализацию.
Шаблоны проектирования для PHP.
https://habrahabr.ru/post/214285/
Интерфейс строителя,
реализуемый классами,
и класс для управления
процессом.
English     Русский Правила