極簡設計模式-工廠模式

long2ge發表於2021-11-11

簡述

工廠模式分三種型別。

    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();
    }  
}

優點

  1. 根據引數就可以建立產品,不需要知道產品的具體實現。
  2. 實現物件的建立和使用分離。

缺點

  1. 隨著時間的推移,產品的具體類逐漸增多,工廠的邏輯會逐漸複雜,不利於系統的擴充套件和維護。
  2. 增加產品等級結構,需要增加對應的工廠類,增加產品族也必須修改工廠類。

何時使用

  1. 根據不同的條件生成不同的物件,並且建立的物件比較少,例如框架中配置的驅動。
  2. 一個物件的建立比較複雜。

實際應用場景

  1. PDO中的資料庫驅動。Mysql,DB2,還是Oracle。

工廠方法模式 - Factory Method Pattern

定義

  1. 一個用於建立物件的介面,讓子類決定將哪一個類例項化(一個工廠例項化一個產品類)。
  2. 工廠方法模式又簡稱為工廠模式(Factory Pattern),又可稱作虛擬構造器模式(Virtual Constructor Pattern)或多型工廠模式(Polymorphic Factory Pattern)。

一句話概括設計模式

不同的工廠返回不同的產品物件。

結構中包含的角色

  1. Product(抽象產品)
  2. ConcreteProduct(具體產品)
  3. Factory(抽象工廠)
  4. 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();
    }     
}

優點

  1. 客戶端只要知道產品對應的工廠即可,不需要知道具體產品的類名。
  2. 新增產品只需要新增一個具體工廠和具體產品就可以了,可擴充套件性非常好。

缺點

  1. 新增產品會導致系統中存在大量的工廠類。
  2. 使用了抽象,並且實現時可能還會用到反射或者IOC,增加了系統的複雜度。

何時使用

  1. 工廠方法模式實際上是多個簡單工廠模式的集合。所以,當簡單工廠裡面的產品過多時,可以使用工廠方法模式解耦。
  2. 執行時動態決定所需的類。可將具體工廠類的類名儲存在配置檔案,執行時透過反射例項化。雖然簡單工廠也可以做到,但是違反了開閉原則。

實際應用場景

  1. 商城的商品有精選商品,收藏的商品,銷售最高的商品,每類商品都有所差異,可以使用工廠方法模式設計。
  2. 框架中,透過配置例項化類。例如laravl中,透過config/cache配置選擇快取(redis 或 memcached)驅動。

抽象工廠模式-Abstract Factory Pattern

定義

提供一個建立一系列相關或相互依賴物件的介面(每個工廠負責建立整個產品族),而無須指定它們具體的類。

一句話概括設計模式

一個工廠有不同的方法,不同的方法返回不同的產品物件。簡單就是一個工廠返回一系列產品。

結構中包含的角色

  1. AbstractFactory(抽象工廠)
  2. ConcreteFactory(具體工廠)
  3. AbstractProduct(抽象產品)
  4. 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();  
    }  
}

優點

  1. 增加新的產品族(新增具體工廠和具體產品)無須修改已有系統,符合開閉原則。

缺點

  1. 增加新的產品等級結構(所有具體工廠都要修改,新增抽象產品和具體產品),需要對原有系統進行較大的修改。

何時使用

  1. 抽象工廠模式實際上是多個工廠方法模式的集合。所以,當工廠方法模式裡面存在多個產品等級結構時,可以使用抽象工廠模式。
  2. 同一個產品族的產品,它們之間打包在一起使用。

實際應用場景

  1. 同一個產品族的產品。qq皮膚,視窗和選單都屬於同一個主題。
  2. 不同作業系統的程式。按鈕與文字框都是屬於某一作業系統。
本作品採用《CC 協議》,轉載必須註明作者和本文連結
Long2Ge

相關文章