設計模式專題(一)工廠模式

目錄

工廠模式

簡單工廠模式

工廠方法模式

抽象工廠模式

工廠模式

爲了便於理解,這裏做一個小案例:

1、首先製造一個牛奶類:

public interface Milk {

    /**
     * 獲取一個標準產品
     * @return
     */
    public String getName();

}

2、然後製造很多的具體牛奶類,實現這個接口:

蒙牛類:

public class Mengniu implements Milk {

    public String getName() {
        return "蒙牛";
    }
}

特侖蘇類:

public class Telunsu implements Milk {

    public String getName() {
        return "特侖蘇";
    }
}

伊利類:

public class Yili implements  Milk {

    public String getName() {
        return "伊利";
    }
}

簡單工廠模式

含義:

  • 簡單工廠模式(Simple Factory Pattern)是指由一個工廠對象決定創建出哪一種產品類的實例。

適用場景:

  • 工廠類負責創建的對象較少。
  • 客戶端只需要傳入工廠類的參數,對於如何創建對象的邏輯不需要關心。

優點:

  • 只需傳入一個正確的參數,就可以獲取你所需要的對象無須知道其創建的細節。

缺點 :

  • 工廠類的職責相對過重,增加新的產品時需要修改工廠類的判斷邏輯,違背開閉原則。
  • 不易於擴展過於複雜的產品結構。

1、創建一個簡單工廠

public class SimpleFactory {
    public Milk getMilk(String name){
        if("特侖蘇".equals(name)){
            return new Telunsu();
        }else if("伊利".equals(name)){
            return new Yili();
        }else if("蒙牛".equals(name)){
            return new Mengniu();
        }else {
            System.out.println("不能生產您所需的產品");
            return null;
        }
    }
}

2、測試簡單工廠模式   

public static void main(String[] args) {
    
        //這個new的過程實際上一個比較複雜的過程
        //有人民幣及不需要自己new了
        System.out.println(new Telunsu().getName());

        //小作坊式的生產模式
        //用戶本身不再關心生產的過程,而只需要關心這個結果
        //假如:特侖蘇、伊利、蒙牛
        //成分配比都是不一樣的
        SimpleFactory factory = new SimpleFactory();

        //把用戶的需求告訴工廠
        //創建產品的過程隱藏了,對於用戶而且完全不清楚是怎麼產生的
        System.out.println(factory.getMilk("特侖蘇").getName());
    }

工廠方法模式

含義:

  • 工廠方法模式(Fatory Method Pattern)是指定義一個創建對象的接口,但讓實現這個接口的類來決定實例化哪個類,工廠方法讓類的實例化推遲到子類中進行。主要解決產品擴展的問題。

適用場景:

  • 創建對象需要大量重複的代碼。
  • 客戶端(應用層)不依賴於產品類實例如何被創建、實現等細節。
  • 一個類通過其子類來指定創建哪個對象。

優點:

  • 用戶只需關心所需產品對應的工廠,無須關心創建細節。
  • 加入新產品符合開閉原則,提高了系統的可擴展性。

缺點 :

  • 類的個數容易過多,增加了代碼結構的複雜度。
  • 增加了系統的抽象性和理解難度。

1、創建工廠

public interface Factory {

    //工廠必然具有生產產品技能,統一的產品出口
    Milk getMilk();

}

2、創建工廠實現類

public class MengniuFactory implements  Factory {
    public Milk getMilk() {
        return new Mengniu();
    }
}
public class TelunsuFactory implements Factory {
    public Milk getMilk() {
        return new Telunsu();
    }
}
public class YiliFactory implements Factory {
    public Milk getMilk() {
        return new Yili();
    }
}

3、測試工廠方法模式

public static void main(String[] args) {
        //System.out.println(new Factory().getMilk(););
        //貨比三家
        //不知道誰好誰好誰壞
        //配置,可能會配置錯
        Factory factory = new SanluFactory();
        System.out.println(factory.getMilk());
    }

抽象工廠模式

含義:

  • 抽象工廠模式(Abastract Factory Pattern)是指提供一個創建一系列相關或相互依賴對象的接口,無須指定他們具體的類。
  • 客戶端(應用層)不依賴於產品類實例如何被創建、實現等細節,強調的是一系列相關的產品對象(屬於同一產品族)一起使用創建對象需要大量重複的代碼。需要提供一個產品類的庫,所有的產品以同樣的接口出現,從而使客戶端不依賴於具體實現。

適用場景:

  • 客戶端(應用層)不依賴於產品類實例如何被創建、實現等細節。
  • 強調一系列相關的產品對象(屬於同一產品族)一起使用創建對象需要大量重複的代碼。
  • 提供一個產品類的庫,所有的產品以同樣的接口出現,從而使客戶端不依賴於具體實現。

優點:

  • 具體產品在應用層代碼隔離,無須關心創建細節
  • 將一個系列的產品族統一到一起創建。

缺點 :

  • 規定了所有可能被創建的產品集合,產品族中擴展新的產品困難,需要修改抽象工廠的接口。
  • 增加了系統的抽象性和理解難度。

1、創建抽象工廠

public abstract class AbstractFactory {

    //公共的邏輯
    //方便於統一管理

    /**
     * 獲得一個蒙牛品牌的牛奶
     * @return
     */
    public  abstract Milk getMengniu();

    /**
     * 獲得一個伊利品牌的牛奶
     * @return
     */
    public abstract  Milk getYili();

    /**
     * 獲得一個特侖蘇品牌的牛奶
     * @return
     */
    public  abstract  Milk getTelunsu();

}

2、創建抽象工廠實現類

public class MilkFactory extends  AbstractFactory {

    @Override
    public Milk getMengniu() {
        return new Mengniu();
    }
    
    @Override
    public Milk getYili() {
        return new Yili();
    }
    
    @Override
    public Milk getTelunsu() {
        return new Telunsu();
    }
}

3、測試抽象工廠模式

public static void main(String[] args) {

        MilkFactory factory = new MilkFactory();
        //對於用戶而言,更加簡單了
        //用戶只有選擇的權利了,保證了程序的健壯性
        System.out.println(factory.getMengniu());
    }

 

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