Паттерн проектирования Abstract Factory (Абстрактная фабрика) на PHP

Абстрактная фабрика (англ. Abstract factory) — порождающий шаблон проектирования, позволяющий изменять поведениесистемы, варьируя создаваемые объекты, при этом сохраняя интерфейсы. Он позволяет создавать целые группывзаимосвязанных объектов, которые, будучи созданными одной фабрикой, реализуют общее поведение. Шаблон реализуетсясозданием абстрактного класса FormBuilder, который представляет собой интерфейс для создания компонентов системы(например, для оконного интерфейса он может создавать окна и кнопки). Затем пишутся наследующиеся от него классы,реализующие этот интерфейс.


Цель

Предоставляет интерфейс для создания семейств взаимосвязанных или взаимозависимых объектов, не специфицируя ихконкретных классов.


Плюсы

  • изолирует конкретные классы;
  • упрощает замену семейств продуктов;
  • гарантирует сочетаемость продуктов.

Минусы

  • сложно добавить поддержку нового вида продуктов.

Применение

  • Система не должна зависеть от того, как создаются, компонуются и представляются входящие в нее объекты.
  • Входящие в семейство взаимосвязанные объекты должны использоваться вместе и вам необходимо обеспечить выполнениеэтого ограничения.
  • Система должна конфигурироваться одним из семейств составляющих ее объектов.
  • Требуется предоставить библиотеку объектов, раскрывая только их интерфейсы, но не реализацию.

Паттерн проектирования Abstract Factory (Абстрактная фабрика) на PHP

  1: <?php
  2:
  3:
/* Form */
  4:
  5:
abstract class FormAbstract
  6:
{
  7: }
  8:
  9: class 
WindowsForm extends FormAbstract
 10:
{
 11: }
 12:
 13: class 
LinuxForm extends FormAbstract
 14:
{
 15: }
 16:
 17: class 
WebForm extends FormAbstract
 18:
{
 19: }
 20:
 21:
/* Button */
 22:
 23:
abstract class ButtonAbstract
 24:
{
 25: }
 26:
 27: class 
WindowsButton extends ButtonAbstract
 28:
{
 29: }
 30:
 31: class 
LinuxButton extends ButtonAbstract
 32:
{
 33: }
 34:
 35: class 
WebButton extends ButtonAbstract
 36:
{
 37: }
 38:
 39:
/* Label */
 40:
 41:
abstract class LabelAbstract
 42:
{
 43: }
 44:
 45: class 
WindowsLabel extends LabelAbstract
 46:
{
 47: }
 48:
 49: class 
LinuxLabel extends LabelAbstract
 50:
{
 51: }
 52:
 53: class 
WebLabel extends LabelAbstract
 54:
{
 55: }
 56:
 57:
/* Factory */
 58:
 59:
abstract classFormBuilder
 60:
{
 61:     abstract public function 
createForm();
 62:
 63:     abstract public function 
createButton();
 64:
 65:     abstract public function 
createLabel();
 66: }
 67:
 68: class 
WindowsFormBuilder extends FormBuilder
 69:
{
 70:     public function 
createForm()
 71:     {
 72:         return new 
WindowsForm();
 73:     }
 74:
 75:     public function 
createButton()
 76:     {
 77:         return new 
WindowsButton();
 78:     }
 79:
 80:     public function 
createLabel()
 81:     {
 82:         return new 
WindowsLabel();
 83:     }
 84: }
 85:
 86: class 
LinuxFormBuilder extends FormBuilder
 87:
{
 88:     public function 
createForm()
 89:     {
 90:         return 
newLinuxForm();
 91:     }
 92:
 93:     public function 
createButton()
 94:     {
 95:         return new 
LinuxButton();
 96:     }
 97:
 98:     public function 
createLabel()
 99:     {
100:         return new 
LinuxLabel();
101:     }
102: }
103:
104: class 
WebFormBuilder extends FormBuilder
105:
{
106:     public function 
createForm()
107:     {
108:         return new 
WebForm();
109:     }
110:
111:     public function 
createButton()
112:     {
113:         return new 
WebButton();
114:     }
115:
116:     public function 
createLabel()
117:     {
118:         return new 
WebLabel();
119:     }
120: }
121:
122:
$builder = new LinuxFormBuilder();
123:
$form $builder->createForm();
124:
$button $builder->createButton();
125:
$label $builder->createLabel();
126: function 
createScreen(
127:     
FormAbstract $form,
128:     
ButtonAbstract $button,
129:     
LabelAbstract $label
130:
)
131: {
132:     
//create screen
133:
}
134:
135:
createScreen($form$button$label);

Теги: Абстрактная фабрика, Abstract factory, Порождающие шаблоны


Похожие статьи

Паттерн проектирования Builder (Строитель) на PHP

Паттерн проектирования Lazy initialization (Отложенная инициализация) на PHP

Паттерн проектирования Prototype (Прототип) на PHP

Паттерн проектирования Factory Method (Фабричный метод) на PHP

Паттерн проектирования Singleton (Одиночка) на PHP

Паттерн проектирования Object pool (Объектный пул) на PHP

Паттерн проектирования Resource Acquisition Is Initialization - RAII (Получение ресурса есть инициализация) на PHP

Паттерн проектирования Multiton (Пул одиночек) на PHP