《JAVA與模式》— 抽象工廠模式

舉個生活中常見的例子——組裝電腦觅彰,我們在組裝電腦的時候吩蔑,通常需要選擇一系列的配件,比如CPU填抬、硬盤烛芬、內(nèi)存、主板飒责、電源赘娄、機箱等。為討論使用簡單點宏蛉,只考慮選擇CPU和主板的問題遣臼。

事實上,在選擇CPU的時候檐晕,面臨一系列的問題暑诸,比如品牌、型號辟灰、針腳數(shù)目个榕、主頻等問題,只有把這些問題都確定下來芥喇,才能確定具體的CPU西采。

同樣,在選擇主板的時候继控,也有一系列問題械馆,比如品牌胖眷、芯片組、集成芯片霹崎、總線頻率等問題珊搀,也只有這些都確定了,才能確定具體的主板尾菇。

選擇不同的CPU和主板境析,是每個客戶在組裝電腦的時候,向裝機公司提出的要求派诬,也就是我們每個人自己擬定的裝機方案劳淆。

在最終確定這個裝機方案之前,還需要整體考慮各個配件之間的兼容性默赂。比如:CPU和主板沛鸵,如果使用Intel的CPU和AMD的主板是根本無法組裝的。因為Intel的CPU針腳數(shù)與AMD主板提供的CPU插口不兼容缆八,就是說如果使用Intel的CPU根本就插不到AMD的主板中曲掰,所以裝機方案是整體性的,里面選擇的各個配件之間是有關(guān)聯(lián)的奈辰。

對于裝機工程師而言蜈缤,他只知道組裝一臺電腦,需要相應的配件冯挎,但是具體使用什么樣的配件底哥,還得由客戶說了算。也就是說裝機工程師只是負責組裝房官,而客戶負責選擇裝配所需要的具體的配件趾徽。因此,當裝機工程師為不同的客戶組裝電腦時翰守,只需要根據(jù)客戶的裝機方案孵奶,去獲取相應的配件,然后組裝即可蜡峰。

使用簡單工廠模式的解決方案

考慮客戶的功能了袁,需要選擇自己需要的CPU和主板,然后告訴裝機工程師自己的選擇湿颅,接下來就等著裝機工程師組裝電腦了载绿。

對裝機工程師而言,只是知道CPU和主板的接口油航,而不知道具體實現(xiàn)崭庸,很明顯可以用上簡單工廠模式或工廠方法模式。為了簡單,這里選用簡單工廠怕享≈瓷模客戶告訴裝機工程師自己的選擇,然后裝機工程師會通過相應的工廠去獲取相應的實例對象函筋。

在這里插入圖片描述

源代碼

CPU接口與具體實現(xiàn)

public interface Cpu {
    public void calculate();
}
public class IntelCpu implements Cpu {
    /**
     * CPU的針腳數(shù)
     */
    private int pins = 0;
    public  IntelCpu(int pins){
        this.pins = pins;
    }
    @Override
    public void calculate() {
        // TODO Auto-generated method stub
        System.out.println("Intel CPU的針腳數(shù):" + pins);
    }

}
public class AmdCpu implements Cpu {
    /**
     * CPU的針腳數(shù)
     */
    private int pins = 0;
    public  AmdCpu(int pins){
        this.pins = pins;
    }
    @Override
    public void calculate() {
        // TODO Auto-generated method stub
        System.out.println("AMD CPU的針腳數(shù):" + pins);
    }
}

主板接口與具體實現(xiàn)

public interface Mainboard {
    public void installCPU();
}
public class IntelMainboard implements Mainboard {
    /**
     * CPU插槽的孔數(shù)
     */
    private int cpuHoles = 0;
    /**
     * 構(gòu)造方法沙合,傳入CPU插槽的孔數(shù)
     * @param cpuHoles
     */
    public IntelMainboard(int cpuHoles){
        this.cpuHoles = cpuHoles;
    }
    @Override
    public void installCPU() {
        // TODO Auto-generated method stub
        System.out.println("Intel主板的CPU插槽孔數(shù)是:" + cpuHoles);
    }

}
public class AmdMainboard implements Mainboard {
    /**
     * CPU插槽的孔數(shù)
     */
    private int cpuHoles = 0;
    /**
     * 構(gòu)造方法,傳入CPU插槽的孔數(shù)
     * @param cpuHoles
     */
    public AmdMainboard(int cpuHoles){
        this.cpuHoles = cpuHoles;
    }
    @Override
    public void installCPU() {
        // TODO Auto-generated method stub
        System.out.println("AMD主板的CPU插槽孔數(shù)是:" + cpuHoles);
    }
}

CPU與主板工廠類

public class CpuFactory {
    public static Cpu createCpu(int type){
        Cpu cpu = null;
        if(type == 1){
            cpu = new IntelCpu(755);
        }else if(type == 2){
            cpu = new AmdCpu(938);
        }
        return cpu;
    }
}
public class MainboardFactory {
    public static Mainboard createMainboard(int type){
        Mainboard mainboard = null;
        if(type == 1){
            mainboard = new IntelMainboard(755);
        }else if(type == 2){
            mainboard = new AmdMainboard(938);
        }
        return mainboard;
    }
}

裝機工程師類與客戶類運行結(jié)果如下:

public class ComputerEngineer {
    /**
     * 定義組裝機需要的CPU
     */
    private Cpu cpu = null;
    /**
     * 定義組裝機需要的主板
     */
    private Mainboard mainboard = null;
    public void makeComputer(int cpuType , int mainboard){
        /**
         * 組裝機器的基本步驟
         */
        //1:首先準備好裝機所需要的配件
        prepareHardwares(cpuType, mainboard);
        //2:組裝機器
        //3:測試機器
        //4:交付客戶
    }
    private void prepareHardwares(int cpuType , int mainboard){
        //這里要去準備CPU和主板的具體實現(xiàn)跌帐,為了示例簡單灌诅,這里只準備這兩個
        //可是,裝機工程師并不知道如何去創(chuàng)建含末,怎么辦呢?
        
        //直接找相應的工廠獲取
        this.cpu = CpuFactory.createCpu(cpuType);
        this.mainboard = MainboardFactory.createMainboard(mainboard);
        
        //測試配件是否好用
        this.cpu.calculate();
        this.mainboard.installCPU();
    }
}
public class Client {
   public static void main(String[]args){
       ComputerEngineer cf = new ComputerEngineer();
       cf.makeComputer(1,1);
   }
}

運行結(jié)果如下:


在這里插入圖片描述

上面的實現(xiàn)即舌,雖然通過簡單工廠方法解決了:對于裝機工程師佣盒,只知CPU和主板的接口,而不知道具體實現(xiàn)的問題顽聂。但還有一個問題沒有解決肥惭,那就是這些CPU對象和主板對象其實是有關(guān)系的,需要相互匹配的紊搪。而上面的實現(xiàn)中蜜葱,并沒有維護這種關(guān)聯(lián)關(guān)系,CPU和主板是由客戶任意選擇耀石,這是有問題的牵囤。比如在客戶端調(diào)用makeComputer時,傳入?yún)?shù)為(1,2)滞伟,運行結(jié)果如下:


在這里插入圖片描述

觀察上面結(jié)果就會看出問題揭鳞。客戶選擇的是Intel的CPU針腳數(shù)為755梆奈,而選擇的主板是AMD野崇,主板上的CPU插孔是938,根本無法組裝亩钟,這就是沒有維護配件之間的關(guān)系造成的乓梨。該怎么解決這個問題呢?

引進抽象工廠模式

每一個模式都是針對一定問題的解決方案清酥。抽象工廠模式與工廠方法模式的最大區(qū)別就在于扶镀,工廠方法模式針對的是一個產(chǎn)品等級結(jié)構(gòu);而抽象工廠模式則需要面對多個產(chǎn)品等級結(jié)構(gòu)焰轻。

在學習抽象工廠具體實例之前狈惫,應該明白兩個重要的概念:產(chǎn)品族和產(chǎn)品等級。

所謂產(chǎn)品族,是指位于不同產(chǎn)品等級結(jié)構(gòu)中胧谈,功能相關(guān)聯(lián)的產(chǎn)品組成的家族忆肾。比如AMD的主板、芯片組菱肖、CPU組成一個家族客冈,Intel的主板、芯片組稳强、CPU組成一個家族场仲。而這兩個家族都來自于三個產(chǎn)品等級:主板、芯片組退疫、CPU渠缕。一個等級結(jié)構(gòu)是由相同的結(jié)構(gòu)的產(chǎn)品組成,示意圖如下:


在這里插入圖片描述

顯然褒繁,每一個產(chǎn)品族中含有產(chǎn)品的數(shù)目亦鳞,與產(chǎn)品等級結(jié)構(gòu)的數(shù)目是相等的。產(chǎn)品的等級結(jié)構(gòu)與產(chǎn)品族將產(chǎn)品按照不同方向劃分棒坏,形成一個二維的坐標系燕差。橫軸表示產(chǎn)品的等級結(jié)構(gòu),縱軸表示產(chǎn)品族坝冕,上圖共有兩個產(chǎn)品族徒探,分布于三個不同的產(chǎn)品等級結(jié)構(gòu)中。只要指明一個產(chǎn)品所處的產(chǎn)品族以及它所屬的等級結(jié)構(gòu)喂窟,就可以唯一的確定這個產(chǎn)品测暗。

上面所給出的三個不同的等級結(jié)構(gòu)具有平行的結(jié)構(gòu)。因此磨澡,如果采用工廠方法模式偷溺,就勢必要使用三個獨立的工廠等級結(jié)構(gòu)來對付這三個產(chǎn)品等級結(jié)構(gòu)。由于這三個產(chǎn)品等級結(jié)構(gòu)的相似性钱贯,會導致三個平行的工廠等級結(jié)構(gòu)挫掏。隨著產(chǎn)品等級結(jié)構(gòu)的數(shù)目的增加,工廠方法模式所給出的工廠等級結(jié)構(gòu)的數(shù)目也會隨之增加秩命。如下圖:


在這里插入圖片描述

那么尉共,是否可以使用同一個工廠等級結(jié)構(gòu)來對付這些相同或者極為相似的產(chǎn)品等級結(jié)構(gòu)呢?當然可以的弃锐,而且這就是抽象工廠模式的好處袄友。同一個工廠等級結(jié)構(gòu)負責三個不同產(chǎn)品等級結(jié)構(gòu)中的產(chǎn)品對象的創(chuàng)建。


在這里插入圖片描述

可以看出霹菊,一個工廠等級結(jié)構(gòu)可以創(chuàng)建出分屬于不同產(chǎn)品等級結(jié)構(gòu)的一個產(chǎn)品族中的所有對象剧蚣。顯然支竹,這時候抽象工廠模式比簡單工廠模式、工廠方法模式更有效率鸠按。對應于每一個產(chǎn)品族都有一個具體工廠礼搁。而每一個具體工廠負責創(chuàng)建屬于同一個產(chǎn)品族,但是分屬于不同等級結(jié)構(gòu)的產(chǎn)品目尖。

抽象工廠模式結(jié)構(gòu)

抽象工廠模式是對象的創(chuàng)建模式馒吴,它是工廠方法模式的進一步推廣。

假設(shè)一個子系統(tǒng)需要一些產(chǎn)品對象瑟曲,而這些產(chǎn)品又屬于一個以上的產(chǎn)品等級結(jié)構(gòu)饮戳。那么為了將消費這些產(chǎn)品對象的責任和創(chuàng)建這些產(chǎn)品對象的責任分割開來,可以引進抽象工廠模式洞拨。這樣的話扯罐,消費產(chǎn)品的一方不需要直接參與產(chǎn)品的創(chuàng)建工作,而只需要向一個公用的工廠接口請求所需要的產(chǎn)品烦衣。

通過使用抽象工廠模式歹河,可以處理具有相同(或者相似)等級結(jié)構(gòu)中的多個產(chǎn)品族中的產(chǎn)品對象的創(chuàng)建問題。如下圖所示:


在這里插入圖片描述

由于這兩個產(chǎn)品族的等級結(jié)構(gòu)相同琉挖,因此使用同一個工廠族也可以處理這兩個產(chǎn)品族的創(chuàng)建問題,這就是抽象工廠模式涣脚。

根據(jù)產(chǎn)品角色的結(jié)構(gòu)圖示辈,就不難給出工廠角色的結(jié)構(gòu)設(shè)計圖。

在這里插入圖片描述

可以看出遣蚀,每一個工廠角色都有兩個工廠方法矾麻,分別負責創(chuàng)建分屬不同產(chǎn)品等級結(jié)構(gòu)的產(chǎn)品對象。
在這里插入圖片描述

源代碼

前面示例實現(xiàn)的CPU接口和CPU實現(xiàn)對象芭梯,主板接口和主板實現(xiàn)對象险耀,都不需要變化。

前面示例中創(chuàng)建CPU的簡單工廠和創(chuàng)建主板的簡單工廠玖喘,都不再需要甩牺。

新加入的抽象工廠類和實現(xiàn)類:

public interface AbstractFactory {
    /**
     * 創(chuàng)建CPU對象
     * @return CPU對象
     */
    public Cpu createCpu();
    /**
     * 創(chuàng)建主板對象
     * @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);
    }

}

裝機工程師類跟前面的實現(xiàn)相比,主要的變化是:從客戶端不再傳入選擇CPU和主板的參數(shù)累奈,而是直接傳入客戶已經(jīng)選擇好的產(chǎn)品對象贬派。這樣就避免了單獨去選擇CPU和主板所帶來的兼容性問題,客戶要選就是一套澎媒,就是一個系列搞乏。

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和主板的具體實現(xiàn),為了示例簡單戒努,這里只準備這兩個
        //可是请敦,裝機工程師并不知道如何去創(chuàng)建,怎么辦呢?
        
        //直接找相應的工廠獲取
        this.cpu = af.createCpu();
        this.mainboard = af.createMainboard();
        
        //測試配件是否好用
        this.cpu.calculate();
        this.mainboard.installCPU();
    }
}

客戶端代碼:

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

抽象工廠的功能是為一系列相關(guān)對象或相互依賴的對象創(chuàng)建一個接口萤皂。一定要注意,這個接口內(nèi)的方法不是任意堆砌的勾笆,而是一系列相關(guān)或相互依賴的方法敌蚜。比如上面例子中的主板和CPU,都是為了組裝一臺電腦的相關(guān)對象窝爪。不同的裝機方案弛车,代表一種具體的電腦系列。


在這里插入圖片描述

由于抽象工廠定義的一系列對象通常是相關(guān)或相互依賴的蒲每,這些產(chǎn)品對象就構(gòu)成了一個產(chǎn)品族纷跛,也就是抽象工廠定義了一個產(chǎn)品族。

這就帶來非常大的靈活性邀杏,切換產(chǎn)品族的時候贫奠,只要提供不同的抽象工廠實現(xiàn)就可以了,也就是說現(xiàn)在是以一個產(chǎn)品族作為一個整體被切換望蜡。

在這里插入圖片描述

在什么情況下應當使用抽象工廠模式

1.一個系統(tǒng)不應當依賴于產(chǎn)品類實例如何被創(chuàng)建唤崭、組合和表達的細節(jié),這對于所有形態(tài)的工廠模式都是重要的脖律。
2.這個系統(tǒng)的產(chǎn)品有多于一個的產(chǎn)品族谢肾,而系統(tǒng)只消費其中某一族的產(chǎn)品。
3.同屬于同一個產(chǎn)品族的產(chǎn)品是在一起使用的小泉,這一約束必須在系統(tǒng)的設(shè)計中體現(xiàn)出來芦疏。(比如:Intel主板必須使用Intel CPU、Intel芯片組)
4.系統(tǒng)提供一個產(chǎn)品類的庫微姊,所有的產(chǎn)品以同樣的接口出現(xiàn)酸茴,從而使客戶端不依賴于實現(xiàn)俘侠。

抽象工廠模式的起源

抽象工廠模式的起源或者最早的應用检吆,是用于創(chuàng)建分屬于不同操作系統(tǒng)的視窗構(gòu)建。比如:命令按鍵(Button)與文字框(Text)都是視窗構(gòu)建抽兆,在UNIX操作系統(tǒng)的視窗環(huán)境和Windows操作系統(tǒng)的視窗環(huán)境中配喳,這兩個構(gòu)建有不同的本地實現(xiàn)飘诗,它們的細節(jié)有所不同。

在每一個操作系統(tǒng)中界逛,都有一個視窗構(gòu)建組成的構(gòu)建家族昆稿。在這里就是Button和Text組成的產(chǎn)品族。而每一個視窗構(gòu)件都構(gòu)成自己的等級結(jié)構(gòu)息拜,由一個抽象角色給出抽象的功能描述溉潭,而由具體子類給出不同操作系統(tǒng)下的具體實現(xiàn)净响。


在這里插入圖片描述

可以發(fā)現(xiàn)在上面的產(chǎn)品類圖中,有兩個產(chǎn)品的等級結(jié)構(gòu)喳瓣,分別是Button等級結(jié)構(gòu)和Text等級結(jié)構(gòu)馋贤。同時有兩個產(chǎn)品族,也就是UNIX產(chǎn)品族和Windows產(chǎn)品族畏陕。UNIX產(chǎn)品族由UNIX Button和UNIX Text產(chǎn)品構(gòu)成配乓;而Windows產(chǎn)品族由Windows Button和Windows Text產(chǎn)品構(gòu)成。


在這里插入圖片描述

系統(tǒng)對產(chǎn)品對象的創(chuàng)建需求由一個工程的等級結(jié)構(gòu)滿足惠毁,其中有兩個具體工程角色犹芹,即UnixFactory和WindowsFactory。UnixFactory對象負責創(chuàng)建Unix產(chǎn)品族中的產(chǎn)品鞠绰,而WindowsFactory對象負責創(chuàng)建Windows產(chǎn)品族中的產(chǎn)品腰埂。這就是抽象工廠模式的應用,抽象工廠模式的解決方案如下圖:
在這里插入圖片描述

顯然蜈膨,一個系統(tǒng)只能夠在某一個操作系統(tǒng)的視窗環(huán)境下運行屿笼,而不能同時在不同的操作系統(tǒng)上運行。所以翁巍,系統(tǒng)實際上只能消費屬于同一個產(chǎn)品族的產(chǎn)品驴一。

在現(xiàn)代的應用中,抽象工廠模式的使用范圍已經(jīng)大大擴大了灶壶,不再要求系統(tǒng)只能消費某一個產(chǎn)品族了肝断。因此,可以不必理會前面所提到的原始用意例朱。

抽象工廠模式的優(yōu)點

分離接口和實現(xiàn)

客戶端使用抽象工廠來創(chuàng)建需要的對象孝情,而客戶端根本就不知道具體的實現(xiàn)是誰鱼蝉,客戶端只是面向產(chǎn)品的接口編程而已洒嗤。也就是說,客戶端從具體的產(chǎn)品實現(xiàn)中解耦魁亦。

使切換產(chǎn)品族變得容易

因為一個具體的工廠實現(xiàn)代表的是一個產(chǎn)品族渔隶,比如上面例子的從Intel系列到AMD系列只需要切換一下具體工廠。

抽象工廠模式的缺點

不太容易擴展新的產(chǎn)品

如果需要給整個產(chǎn)品族添加一個新的產(chǎn)品洁奈,那么就需要修改抽象工廠间唉,這樣就會導致修改所有的工廠實現(xiàn)類。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末利术,一起剝皮案震驚了整個濱河市呈野,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌印叁,老刑警劉巖被冒,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件军掂,死亡現(xiàn)場離奇詭異,居然都是意外死亡昨悼,警方通過查閱死者的電腦和手機蝗锥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來率触,“玉大人终议,你說我怎么就攤上這事〈谢龋” “怎么了穴张?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長垒玲。 經(jīng)常有香客問我陆馁,道長,這世上最難降的妖魔是什么合愈? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任叮贩,我火速辦了婚禮,結(jié)果婚禮上佛析,老公的妹妹穿的比我還像新娘益老。我一直安慰自己,他們只是感情好寸莫,可當我...
    茶點故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布捺萌。 她就那樣靜靜地躺著,像睡著了一般膘茎。 火紅的嫁衣襯著肌膚如雪桃纯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天披坏,我揣著相機與錄音态坦,去河邊找鬼。 笑死棒拂,一個胖子當著我的面吹牛伞梯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播帚屉,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼谜诫,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了攻旦?” 一聲冷哼從身側(cè)響起喻旷,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎牢屋,沒想到半個月后且预,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體牺陶,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年辣之,在試婚紗的時候發(fā)現(xiàn)自己被綠了掰伸。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,146評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡怀估,死狀恐怖狮鸭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情多搀,我是刑警寧澤歧蕉,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站康铭,受9級特大地震影響惯退,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜从藤,卻給世界環(huán)境...
    茶點故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一催跪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧夷野,春花似錦懊蒸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至妒貌,卻和暖如春通危,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背灌曙。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工菊碟, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人平匈。 一個月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓框沟,卻偏偏與公主長得像藏古,于是被迫代替她去往敵國和親增炭。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,107評論 2 356

推薦閱讀更多精彩內(nèi)容

  • 概述 每一個模式都是針對一定問題的解決方案拧晕。抽象工廠模式與工廠方法模式的最大區(qū)別就在于隙姿,工廠方法模式針對的是一個產(chǎn)...
    今晚打肉山閱讀 651評論 0 4
  • 簡單工廠模式 工廠模式我的理解是:他就是為了創(chuàng)建對象的 創(chuàng)建對象的時候,我們一般是alloc一個對象厂捞,如果需要創(chuàng)建...
    GitHubPorter閱讀 8,068評論 6 16
  • //聯(lián)系人:石虎QQ: 1224614774昵稱:嗡嘛呢叭咪哄 一、簡單工廠模式 1欲鹏、簡述首先需要說明一下机久,簡單工...
    石虎132閱讀 1,628評論 1 16
  • 概述 抽象工廠模式是對象的創(chuàng)建模式,它是工廠方法模式的進一步推廣赔嚎。 假設(shè)一個子系統(tǒng)需要一些產(chǎn)品對象膘盖,而這些產(chǎn)品又屬...
    泥孩兒0107閱讀 329評論 0 0
  • 一、場景 舉個生活中常見的例子——組裝電腦尤误,我們在組裝電腦的時候侠畔,通常需要選擇一系列的配件,比如CPU损晤、硬盤软棺、內(nèi)存...
    KwongRay閱讀 357評論 0 0