工廠模式就是負責將大量有共同接口的類實例,而不必事先知道要實例化哪一個類的模式。工廠模式一般分爲三種:簡單工廠模式、工廠方法模式、抽象工廠模式。從模式性質來說,工廠模式屬於創建型模式。
工廠方法定義
工廠方法模式又稱爲工廠模式,也叫虛擬構造器(Virtual Construct)模式或者多態工廠模式(Polymorphic Factory),在工廠模式中,父類負責定義創建對象的接口,而真正實現創建對象的任務交給子類去實現。這樣作的目的是將創建對象的工作延遲到子類中去完成,由子類決定生成哪個具體的對象。
相對模於簡單工廠模式來說,工廠方法模式解決了簡單工廠模式的缺點-違反開放-封閉原則,將添加更多的產品種類以擴展方式就能實現,而不必去修改工廠類或者產品類。
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
|
<?php //
Factory Method interface
IAnimal { function
Eat(); } class
Dog implements
IAnimal { public
function
Feed() { echo
"Dog Eat!\n" ; echo
"<br/>" ; } } class
Cat implements
IAnimal { public
function
Eat() { echo
"Cat Eat!" ; echo
"<br/>" ; } } interface
Feeder { function
Feed(); } class
DogFeeder implements
Feeder { public
function
Feed() { return
new
Dog(); } } class
CatFeeder implements
Feeder { public
function
Feed() { return
new
Cat(); } } //
Test $DogFeeder
= new
DogFeeder(); $Dog
= $DogFeeder ->Feed(); $Dog ->Eat(); $CatFeeder
= new
CatFeeder(); $Cat
= $CatFeeder ->Feed(); $Cat ->Eat(); ?> |
上面代碼中,我們將餵養動物的任務交給對應餵養動物的子類DogFeeder/CatFeeder去執行,不是在Feeder類中去寫邏輯判斷該餵養哪一動物。
優點
我們要另外加一新的品種動物的餵養,只需要新增一個動物類以及動物餵養類,然後在主邏輯代碼裏直接使用對應的動物餵養類調用餵養該動物就好,而不必去修改現在的代碼,在遵循開放-封閉原則基礎上做到很好的對現有系統的擴展。
缺點
我覺得沒什麼缺點,唯一缺點就是新增餵養動物需要新寫動物類以及具體的動物餵養類,但是這個是必須的呀。
應用場景
- 類不知道自己要創建哪個對象
- 類由它的子類類確定創建哪個對象
- 類將創建對象的職責交個它的子類去實現