1. 程式人生 > >設計模式—抽象工廠模式

設計模式—抽象工廠模式

elm 步驟 cli 優點 abstract 工程師 face abs ges

場景問題

舉個生活中常見的例子——組裝電腦,我們在組裝電腦的時候,通常需要選擇一系列的配件,比如CPU、硬盤、內存、主板、電源、機箱等。

需要整體考慮各個配件之間的兼容性。比如:CPU和主板,如果使用Intel的CPU和AMD的主板是根本無法組裝的。因為Intel的CPU針腳數與AMD主板提供的CPU插口不兼容,就是說如果使用Intel的CPU根本就插不到AMD的主板中,所以裝機方案是整體性的,裏面選擇的各個配件之間是有關聯的。

由於抽象工廠定義的一系列對象通常是相關或相互依賴的,這些產品對象就構成了一個產品族,也就是抽象工廠定義了一個產品族。

這就帶來非常大的靈活性,切換產品族的時候,只要提供不同的抽象工廠實現就可以了,也就是說現在是以一個產品族作為一個整體被切換。

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

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

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

抽象工廠類:

public interface AbstractFactory {
    /**
     * 創建CPU對象
     * @return CPU對象
     */
    public Cpu createCpu();
    /**
     * 創建主板對象
     * @return
主板對象 */ public Mainboard createMainboard(); }

具體實現工廠類:

public class IntelFactory implements AbstractFactory {

    @Override
    public Cpu createCpu() {
        // TODO Auto-generated method stub
        return new IntelCpu(755);
    }

    @Override
    public Mainboard createMainboard() {
        
// TODO Auto-generated method stub return new IntelMainboard(755); } }
public class AmdFactory implements AbstractFactory {

    @Override
    public Cpu createCpu() {
        // TODO Auto-generated method stub
        return new IntelCpu(938);
    }

    @Override
    public Mainboard createMainboard() {
        // TODO Auto-generated method stub
        return new IntelMainboard(938);
    }

}

關於產品接口和具體產品實現類已經省略。

裝機工程師類:

public class ComputerEngineer {
    /**
     * 定義組裝機需要的CPU
     */
    private Cpu cpu = null;
    /**
     * 定義組裝機需要的主板
     */
    private Mainboard mainboard = null;
    public void makeComputer(AbstractFactory af){
        /**
         * 組裝機器的基本步驟
         */
        //1:首先準備好裝機所需要的配件
        prepareHardwares(af);
        //2:組裝機器
        //3:測試機器
        //4:交付客戶
    }
    private void prepareHardwares(AbstractFactory af){
        //這裏要去準備CPU和主板的具體實現,為了示例簡單,這裏只準備這兩個
        //可是,裝機工程師並不知道如何去創建,怎麽辦呢?
        
        //直接找相應的工廠獲取
        this.cpu = af.createCpu();
        this.mainboard = af.createMainboard();
        
        //測試配件是否好用
        this.cpu.calculate();
        this.mainboard.installCPU();
    }
}

客戶端代碼:

public class Client {
    public static void main(String[]args){
        //創建裝機工程師對象
        ComputerEngineer cf = new ComputerEngineer();
        //客戶選擇並創建需要使用的產品對象
        AbstractFactory af = new IntelFactory();
        //告訴裝機工程師自己選擇的產品,讓裝機工程師組裝電腦
        cf.makeComputer(af);
    }
}

技術分享

文章摘選自:《JAVA與模式》之抽象工廠模式

設計模式—抽象工廠模式