簡述
工廠模式分三種型別。
1. 簡單工廠模式。
2. 工廠方法模式。
3. 抽象工廠模式。
設計的原則和思想
把物件的建立封裝在工廠類中,解耦物件的建立和使用。
產品等級結構和產品族
產品等級結構 :
繼承結構,就是同類。例如,華為手機,小米手機,魅族手機,這些都是具體實現類,抽象類是手機。
產品族 :
是同一個牌子的產品,都是由同一個工廠生產的。例如,華為手機,華為平板,華為電腦,這些構成了一個華為的產品族。
簡單工廠模式 - Simple Factory Pattern
定義
1. 一個工廠類,根據引數的不同返回不同類的例項。
2. 簡單工廠模式中用於建立例項的方法是靜態(static)方法,因此簡單工廠模式又被稱為靜態工廠方法(Static Factory Method)模式。
一句話概括設計模式
一個靜態方法返回產品物件。
結構中包含的角色
1. Factory(工廠角色)
2. Product(抽象產品角色)
3. ConcreteProduct(具體產品角色)
最小可表達程式碼
// 產品
abstract class Product {}
class ConcreteProductA extends Product {}
class ConcreteProductOther extends Product {}
// 簡單工廠
class SimpleFactory {
public static getProduct($param) : Product
{
if ("A" == $param) {
return new ConcreteProductA();
}
return new ConcreteProductOther();
}
}
優點
- 根據引數就可以建立產品,不需要知道產品的具體實現。
- 實現物件的建立和使用分離。
缺點
- 隨著時間的推移,產品的具體類逐漸增多,工廠的邏輯會逐漸複雜,不利於系統的擴充套件和維護。
- 增加產品等級結構,需要增加對應的工廠類,增加產品族也必須修改工廠類。
何時使用
- 根據不同的條件生成不同的物件,並且建立的物件比較少,例如框架中配置的驅動。
- 一個物件的建立比較複雜。
實際應用場景
- PDO中的資料庫驅動。Mysql,DB2,還是Oracle。
工廠方法模式 - Factory Method Pattern
定義
- 一個用於建立物件的介面,讓子類決定將哪一個類例項化(一個工廠例項化一個產品類)。
- 工廠方法模式又簡稱為工廠模式(Factory Pattern),又可稱作虛擬構造器模式(Virtual Constructor Pattern)或多型工廠模式(Polymorphic Factory Pattern)。
一句話概括設計模式
不同的工廠返回不同的產品物件。
結構中包含的角色
- Product(抽象產品)
- ConcreteProduct(具體產品)
- Factory(抽象工廠)
- ConcreteFactory(具體工廠)
最小可表達程式碼
// 產品
interface Product {}
class ConcreteProductA implements Product {}
class ConcreteProductOther implements Product {}
// 工廠
interface Factory {
public function createProduct() : Product;
}
class ConcreteFactoryA implements Factory {
public public createProduct() : Product
{
return new ConcreteProductA();
}
}
class ConcreteFactoryOther implements Factory {
public public createProduct() : Product
{
return new ConcreteProductOther();
}
}
優點
- 客戶端只要知道產品對應的工廠即可,不需要知道具體產品的類名。
- 新增產品只需要新增一個具體工廠和具體產品就可以了,可擴充套件性非常好。
缺點
- 新增產品會導致系統中存在大量的工廠類。
- 使用了抽象,並且實現時可能還會用到反射或者IOC,增加了系統的複雜度。
何時使用
- 工廠方法模式實際上是多個簡單工廠模式的集合。所以,當簡單工廠裡面的產品過多時,可以使用工廠方法模式解耦。
- 執行時動態決定所需的類。可將具體工廠類的類名儲存在配置檔案,執行時透過反射例項化。雖然簡單工廠也可以做到,但是違反了開閉原則。
實際應用場景
- 商城的商品有精選商品,收藏的商品,銷售最高的商品,每類商品都有所差異,可以使用工廠方法模式設計。
- 框架中,透過配置例項化類。例如laravl中,透過config/cache配置選擇快取(redis 或 memcached)驅動。
抽象工廠模式-Abstract Factory Pattern
定義
提供一個建立一系列相關或相互依賴物件的介面(每個工廠負責建立整個產品族),而無須指定它們具體的類。
一句話概括設計模式
一個工廠有不同的方法,不同的方法返回不同的產品物件。簡單就是一個工廠返回一系列產品。
結構中包含的角色
- AbstractFactory(抽象工廠)
- ConcreteFactory(具體工廠)
- AbstractProduct(抽象產品)
- ConcreteProduct(具體產品)
最小可表達程式碼
// 手機產品
interface Phone {}
class HuaWeiPhone implements Phone {}
class XiaoMiPhone implements Phone {}
// 筆記本產品
interface NoteBook {}
class HuaWeiNoteBook implements NoteBook {}
class XiaoMiNoteBook implements NoteBook {}
// 工廠
interface Factory {
public function createPhone() : Phone;
public function createNoteBook() : NoteBook;
}
// 華為工廠
class HuaWeiFactory implements Factory {
public function createPhone() {
return new HuaWeiPhone();
}
public function createNoteBook() {
return new HuaWeiNoteBook();
}
}
// 小米工廠
class XiaoMiFactory implements Factory {
public function createPhone()
{
return new XiaoMiPhone();
}
public function createNoteBook() {
return new XiaoMiNoteBook();
}
}
優點
- 增加新的產品族(新增具體工廠和具體產品)無須修改已有系統,符合開閉原則。
缺點
- 增加新的產品等級結構(所有具體工廠都要修改,新增抽象產品和具體產品),需要對原有系統進行較大的修改。
何時使用
- 抽象工廠模式實際上是多個工廠方法模式的集合。所以,當工廠方法模式裡面存在多個產品等級結構時,可以使用抽象工廠模式。
- 同一個產品族的產品,它們之間打包在一起使用。
實際應用場景
- 同一個產品族的產品。qq皮膚,視窗和選單都屬於同一個主題。
- 不同作業系統的程式。按鈕與文字框都是屬於某一作業系統。
本作品採用《CC 協議》,轉載必須註明作者和本文連結