вторник, 31 мая 2011 г.

Абстрактная фабрика - (Abstract Factory)

Список паттернов
Код - пример #1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
<?php
/*

Абстрактная фабрика - (Abstract Factory)

Фабрика должна возвращать объекты. Но так как она абстрактная, то изначально нужно
описать абстрактный класс фабрики, и абстрактные объекты которые она будет производить. 

Дале мы описываем реализации классов фабрик на основе абстрактной фабрики и реализации класса объектов
которые она производит. Тем самым у нас есть различные варианты фабрик и объектов с одинковыми
интерфейсами, что может быть удобно.

Далее привожу код. Есть абстрактная фабрика машин. Абстрактный класс машин. Создаем классы фабрики
"ford" и "vaz" и классы ford_machine и vaz_machine. Фабрики будут производить объект "машины", но
свойство "начинака" этих "машин" будет отличаться, прям как в реальной жизни.

*/

abstract class abstract_machine_factory {
    function generate_sedan() {
        return new machine('sedan');
    }
    
    function generate_universal() {
        return new machine('universal');    
    }
    
    function generate_hatchback() {
        return new machine('hatchback');    
    }
}

abstract class abstract_machine {
    protected $_param;

    function __construct($type = 'sedan') {
        $this->_param = array();
        $this->_param['type'] = $type;
    }    
    
    function run() {
        echo 'brrrrrrrrrrrrrr ...';
    }
    
    function get_all_param() {
        return $this->_param;
    }
}

class vaz_machine extends abstract_machine {
    function __construct($type = 'sedan') {
        parent::__construct($type);

        $this->_param['firm'] = 'vaz';
    }

    function run() {
        echo 'tr tr pr tr tr pr ...';
    }
}

class vaz_factory extends abstract_machine_factory {
    function generate_sedan() {
        return new vaz_machine('vedro');
    }
    
    function generate_universal() {
        return new vaz_machine('taz');    
    }
    
    function generate_hatchback() {
        return new vaz_machine('korito');    
    }    
}

class ford_machine extends abstract_machine {
    function __construct($type = 'sedan') {
        parent::__construct($type);
        
        $this->_param['firm'] = 'ford';
    }

    function run() {
        echo 'rrrrrrrrrrrrrrrrr ...';
    }
}

class ford_factory extends abstract_machine_factory {
    function generate_sedan() {
        return new ford_machine('sedan', 'ford');
    }
    
    function generate_universal() {
        return new ford_machine('universal');    
    }
    
    function generate_hatchback() {
        return new ford_machine('hatchback');    
    }    
}

/* Фабрика ford_factory производит машины */
$ford_factory = new ford_factory();
$ford_machine = $ford_factory->generate_sedan();

deb($ford_machine->get_all_param());
deb($ford_machine->run());

/* Фабрика vaz_factory производит машины, функции одинаковые но результат (объекты) разные */
$vaz_factory = new vaz_factory();
$vaz_machine = $vaz_factory->generate_sedan();

deb($vaz_machine->get_all_param());
deb($vaz_machine->run());

/* В результате мы видим на экране:

Array
(
    [type] => sedan
    [firm] => ford
)

rrrrrrrrrrrrrrrrr ...

Array
(
    [type] => vedro
    [firm] => vaz
)

tr tr pr tr tr pr ...

*/

function deb($mVar) {
    echo("<PRE>");
    print_r($mVar);
    echo("</PRE>");
}


Список паттернов

Комментариев нет:

Отправить комментарий