參考《大話設計模式》
比如需要設計一個2個數(shù)字的加減乘法計算器煌抒。
使用簡單工廠模式仍劈,當傳入+-*/后,在工廠類里判斷是實例化哪個類
switch(operate){
case "+":
oper = new operationAdd();
break;
case "-":
oper = new operationSub();
break;
...
}
如果這時想要再來一個開根號的運算摧玫,需要修改這個工廠類耳奕,違反了開閉原則。
所以這里可以用工廠方法模式再來實現(xiàn)
工廠方法模式诬像,類的實例是在客戶端決定的
class AddFactory implements IFactory{//加
public function createOperation(){
return new operationAdd();
}
}
class SubFactory implements IFactory{//減
public function createOperation(){
return new operationSub();
}
}
簡單工廠模式又稱靜態(tài)工廠方法模式
簡單工廠模式的最大優(yōu)點在于工廠類中包含了必要的邏輯判斷屋群,根據(jù)客戶端的選擇條件動態(tài)實例化相關(guān)的類,對于客戶端來說坏挠,去除了與具體產(chǎn)品的依賴芍躏,比如輸入+進行加法時,會自動實例相應的類降狠。
工廠方法模式實現(xiàn)時对竣,客戶端需要決定實例化哪一個工廠來實現(xiàn)運算類庇楞,判斷選擇的問題還是存著的,也就是說否纬,工廠方法把簡單工廠類內(nèi)部的邏輯判斷移動到了客戶端代碼來進行吕晌,想要加功能,本來是改工廠類的临燃,現(xiàn)在是修復客戶端睛驳。這樣也不太好,書中提到可以‘反射’避免分支判斷的問題膜廊,todo乏沸。
抽象工廠模式
定義:提供一個創(chuàng)建一系列相關(guān)或相互依賴對象的接口,而無需指定他們具體的類爪瓜。通俗點來說蹬跃,就是對一系列具有相同點的簡單工廠進行封裝,例如例子中radio和CheckBox樣式是屬于同一種風格的铆铆。
<?php
//類似有2層的關(guān)系蝶缀,一層是工廠,一層是具體產(chǎn)品
//比如生成windows,mac下的 radio和checkbox等等
interface AbstractFactory{
public function createRadio();
public function createCheckbox();
}
interface Radio{
public function create();
}
interface Checkbox{
public function create();
}
class WinRadio implements Radio{
public function create(){
echo "創(chuàng)建win 單選框<br>";
}
}
class WinCheckbox implements Radio{
public function create(){
echo "創(chuàng)建win 復選框<br>";
}
}
class WinFactory implements AbstractFactory{
public function createRadio(){
$obj = new WinRadio();
$obj->create();
}
public function createCheckbox(){
$obj = new WinCheckbox();
$obj->create();
}
}
$obj = new WinFactory;//如果想要換成mac的算灸,直接改這里就像扼劈,這里省略了MacFactory的類
$obj->createRadio();
$obj->createCheckbox();
參考:https://www.liaoxuefeng.com/wiki/1252599548343744/1281319134822433