模式設計之創建對象:簡單工廠模式

簡單工廠模式的定義

簡單工廠模式又叫靜態工廠模式,在簡單工廠模式中,可以根據不同的參數返回不同的實例,被創建的實例通常都有共同的接口。

 

UML圖

 

IProduct:接口。簡單工廠模式所創建的所有對象的接口,它負責描述所有實例要實現的公共接口。

Prouduct:具體子類,是簡單工廠模式的創建目標,可以有多種。

Factory:工廠類,簡單工廠模式的核心,它負責根據邏輯需求,創建所有實例。createProduct方法可以被外界直接調用,創建所需的實例。

 

示例:

  1. 有一個工廠,生產產品Product。
  2. 最近推出了3個產品ProductA/B/C,使用簡單工廠模式實現3款產品的生產。

產品接口

interface Product{
    void Show();
}

3款產品

//具體產品類A
class  ProductA implements Product{

    @Override
    public void Show() {
        System.out.println("生產出了產品A");
    }
}

//具體產品類B
class  ProductB implements Product{

    @Override
    public void Show() {
        System.out.println("生產出了產品C");
    }
}

//具體產品類C
class  ProductC implements Product{

    @Override
    public void Show() {
        System.out.println("生產出了產品C");
    }
}

簡單工廠類:

class  Factory {
    public static Product Manufacture(String ProductName){
        //工廠類裏用switch語句控制生產哪種商品;
        //使用者只需要調用工廠類的靜態方法就可以實現產品類的實例化。
        switch (ProductName){
            case "A":
                return new ProductA();

            case "B":
                return new ProductB();

            case "C":
                return new ProductC();

            default:
                return null;

        }
    }
}
根據用戶需求生成不同類型產品
//工廠產品生產流程
public class SimpleFactoryPattern {
    public static void main(String[] args){
        Factory mFactory = new Factory();

        //客戶要產品A
        try {
           //調用工廠類的靜態方法 & 傳入不同參數從而創建產品實例
            mFactory.Manufacture("A").Show();
        }catch (NullPointerException e){
            System.out.println("沒有這一類產品");
        }

        //客戶要產品B
        try {
            mFactory.Manufacture("B").Show();
        }catch (NullPointerException e){
            System.out.println("沒有這一類產品");
        }

        //客戶要產品C
        try {
            mFactory.Manufacture("C").Show();
        }catch (NullPointerException e){
            System.out.println("沒有這一類產品");
        }

        //客戶要產品D
        try {
            mFactory.Manufacture("D").Show();
        }catch (NullPointerException e){
            System.out.println("沒有這一類產品");
        }
    }
}

輸出結果

生產出了產品A
生產出了產品C
生產出了產品C
沒有這一類產品

 

優缺點

優點

  1. 將創建實例的工作與使用實例的工作分開,使用者不必關心類對象如何創建,實現瞭解耦;
  2. 把初始化實例時的工作放到工廠裏進行,使代碼更容易維護。 更符合面向對象的原則 & 面向接口編程,而不是面向實現編程。

缺點

  1. 工廠類集中了所有實例(產品)的創建邏輯,一旦這個工廠不能正常工作,整個系統都會受到影響;
  2. 違背“開放 - 關閉原則”,一旦添加新產品就不得不修改工廠類的邏輯,這樣就會造成工廠邏輯過於複雜。
  3. 簡單工廠模式由於使用了靜態工廠方法,靜態方法不能被繼承和重寫,會造成工廠角色無法形成基於繼承的等級結構。

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章