Абстрактная фабрика (англ. Abstract factory) — порождающий шаблон проектирования, позволяющий изменять поведениесистемы, варьируя создаваемые объекты, при этом сохраняя интерфейсы. Он позволяет создавать целые группывзаимосвязанных объектов, которые, будучи созданными одной фабрикой, реализуют общее поведение. Шаблон реализуетсясозданием абстрактного класса FormBuilder, который представляет собой интерфейс для создания компонентов системы(например, для оконного интерфейса он может создавать окна и кнопки). Затем пишутся наследующиеся от него классы,реализующие этот интерфейс.
Цель
Предоставляет интерфейс для создания семейств взаимосвязанных или взаимозависимых объектов, не специфицируя ихконкретных классов.
Плюсы
- изолирует конкретные классы;
- упрощает замену семейств продуктов;
- гарантирует сочетаемость продуктов.
Минусы
- сложно добавить поддержку нового вида продуктов.
Применение
- Система не должна зависеть от того, как создаются, компонуются и представляются входящие в нее объекты.
- Входящие в семейство взаимосвязанные объекты должны использоваться вместе и вам необходимо обеспечить выполнениеэтого ограничения.
- Система должна конфигурироваться одним из семейств составляющих ее объектов.
- Требуется предоставить библиотеку объектов, раскрывая только их интерфейсы, но не реализацию.
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);