設計模式之抽象工廠模式案例

抽象工廠模式

抽象工廠模式(Abstract Factory Pattern)是圍繞一個超級工廠創建其他工廠。該超級工廠又稱爲其他工廠的工廠。這種類型的設計模式屬於創建型模式,它提供了一種創建對象的最佳方式。

在抽象工廠模式中,接口是負責創建一個相關對象的工廠,不需要顯式指定它們的類。每個生成的工廠都能按照工廠模式提供對象。

介紹

意圖:提供一個創建一系列相關或相互依賴對象的接口,而無需指定它們具體的類。

主要解決:主要解決接口選擇的問題。

何時使用:系統的產品有多於一個的產品族,而系統只消費其中某一族的產品。

如何解決:在一個產品族裏面,定義多個產品。

關鍵代碼:在一個工廠裏聚合多個同類產品。

應用實例:工作了,爲了參加一些聚會,肯定有兩套或多套衣服吧,比如說有商務裝(成套,一系列具體產品)、時尚裝(成套,一系列具體產品),甚至對於一個家庭來說,可能有商務女裝、商務男裝、時尚女裝、時尚男裝,這些也都是成套的,即一系列具體產品。假設一種情況(現實中是不存在的,要不然,沒法進入共產主義了,但有利於說明抽象工廠模式),在您的家中,某一個衣櫃(具體工廠)只能存放某一種這樣的衣服(成套,一系列具體產品),每次拿這種成套的衣服時也自然要從這個衣櫃中取出了。用 OOP 的思想去理解,所有的衣櫃(具體工廠)都是衣櫃類的(抽象工廠)某一個,而每一件成套的衣服又包括具體的上衣(某一具體產品),褲子(某一具體產品),這些具體的上衣其實也都是上衣(抽象產品),具體的褲子也都是褲子(另一個抽象產品)。

優點:當一個產品族中的多個對象被設計成一起工作時,它能保證客戶端始終只使用同一個產品族中的對象。

缺點:產品族擴展非常困難,要增加一個系列的某一產品,既要在抽象的 Creator 里加代碼,又要在具體的裏面加代碼。

使用場景: 1、QQ 換皮膚,一整套一起換。 2、生成不同操作系統的程序。

注意事項:產品族難擴展,產品等級易擴展。

實現:

創建產品電飯煲RiceCooker接口:

/**
 * 電飯煲 接口
 */
public interface RiceCooker {
    void on();//開
    void off();//關
    void cook();//煮
    void heat();//加熱
}

創建產品攪拌機Blender接口:

/**
 * 攪拌機 接口
 */
public interface Blender {
    void on();//開
    void off();//關
    void stir();//攪拌
}

創建具體的電飯煲類:

/**
 * 蘇泊爾電飯煲
 */
public class SuporRiceCooker implements RiceCooker {
    public void on() {
        System.out.println("蘇泊爾電飯煲開啓");
    }

    public void off() {
        System.out.println("蘇泊爾電飯煲關閉");
    }

    public void cook() {
        System.out.println("蘇泊爾電飯煲煮粥");
    }

    public void heat() {
        System.out.println("蘇泊爾電飯煲加熱");
    }
}

/**
 * 美的 電飯煲
 */
public class MideaRiceCooker implements RiceCooker {
    public void on() {
        System.out.println("美的電飯煲開啓");
    }

    public void off() {
        System.out.println("美的電飯煲關閉");
    }

    public void cook() {
        System.out.println("美的電飯煲煮粥");
    }

    public void heat() {
        System.out.println("美的電飯煲加熱");
    }
}

創建具體的攪拌機類:

/**
 * 蘇泊爾攪拌機
 */
public class SuporBlender implements Blender {
    public void on() {
        System.out.println("蘇泊爾攪拌機開啓");
    }

    public void off() {
        System.out.println("蘇泊爾攪拌機關閉");
    }

    public void stir() {
        System.out.println("蘇泊爾攪拌機攪拌");
    }
}

/**
 * 美的 攪拌機
 */
public class MideaBlender implements Blender {
    public void on() {
        System.out.println("美的攪拌機開啓");
    }

    public void off() {
        System.out.println("美的攪拌機關閉");
    }

    public void stir() {
        System.out.println("美的攪拌機攪拌");
    }
}

創建產品工廠接口:

/**
 * 產品工廠 接口
 */
public interface ProductFactory {
    // 電飯煲
    RiceCooker riceCooker();
    // 攪拌機
    Blender blender();
}

創建具體的產品工廠類:

/**
 * 蘇泊爾工廠
 */
public class SuporFactory implements ProductFactory {
    public RiceCooker riceCooker() {
        return new SuporRiceCooker();
    }

    public Blender blender() {
        return new SuporBlender();
    }
}

/**
 * 美的 工廠
 */
public class MideaFactory implements ProductFactory {
    public RiceCooker riceCooker() {
        return new MideaRiceCooker();
    }

    public Blender blender() {
        return new MideaBlender();
    }
}

創建測試類AbstractMain:

public class AbstractMain {
    public static void main(String[] args) {
        System.out.println("<<<<<<<<<<<<<<蘇泊爾產品>>>>>>>>>>>>>>>>");
        SuporFactory suporFactory = new SuporFactory();

        RiceCooker riceCooker = suporFactory.riceCooker();
        riceCooker.on();
        riceCooker.cook();
        riceCooker.heat();
        riceCooker.off();

        Blender blender = suporFactory.blender();
        blender.on();
        blender.stir();
        blender.off();


        System.out.println("<<<<<<<<<<<<<<美的產品>>>>>>>>>>>>>>>>");

        MideaFactory mideaFactory = new MideaFactory();

        RiceCooker riceCooker1 = mideaFactory.riceCooker();
        riceCooker1.on();
        riceCooker1.cook();
        riceCooker1.heat();
        riceCooker1.off();

        Blender blender1 = mideaFactory.blender();
        blender1.on();
        blender1.stir();
        blender1.off();
    }
}

運行結果:

 

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