說道設計模式,最先講到的設計模式必然是工廠系列的設計模式。下面我們就來看下工廠系列設計模式:
簡單工廠模式
簡單工廠模式嚴格來說都不是一種設計模式,只是工廠方法模式的一個簡單實現,但是我們平時運用最多就是這個簡單工廠模式。
簡單工廠模式通常用在固定且不大會改變的類族的創建。舉個簡單的例子,我們現在有個生化實驗室來克隆人,所以我們要有一個人的模具
人是一個父類:
public class Ren { }
Ren這個父類有兩個子類:男人和女人
public class NanRen extends Ren { }
public class NvRen extends Ren { }
所以我們可以有一個人工廠來分別造出男人和女人(具體怎么造請自行想象,我只是一個宅男程序猿,不是H文作者)。
class RenFactory { public Ren createRen(String gender) { Ren r = null; if (gender == "male") { r = new NanRen(); } else if (gender == "female") { r = new NvRen(); } return r; } }
這是我們的實驗室就能很輕松的制造出男人或者女人了
public class Laboratory { public static void main(String[] args) { RenFactory rf = new RenFactory(); Ren nan = rf.createRen("male"); Ren nv = rf.createRen("female"); } }
上面就是一個簡單工廠模式的簡單例子。以下是具體全部代碼

class Ren { } class NanRen extends Ren { } class NvRen extends Ren { } class RenFactory { public Ren createRen(String gender) { Ren r = null; if (gender == "male") { r = new NanRen(); } else if (gender == "female") { r = new NvRen(); } return r; } } public class Laboratory { public static void main(String[] args) { RenFactory rf = new RenFactory(); Ren nan = rf.createRen("male"); Ren nv = rf.createRen("female"); } }
工廠方法模式
上面說到了簡單工廠方法,下面我們繼續我們的例子來說明工廠方法模式。
現在我們的實驗室不僅僅要男人和女人,我們還兼並了泰國的某個不知名實驗室,我們還生產人妖,所以我們要安裝新的人妖生產線,還需要更新我們的工廠系統。以下是我們的一個更新方案。
class RenYao extends Ren { } class RenFactory { public Ren createRen(String gender) { Ren r = null; if (gender == "male") { r = new NanRen(); } else if (gender == "female") { r = new NvRen(); } else if (gender == "renyao") { r = new RenYao(); } return r; } } public class Laboratory { public static void main(String[] args) { RenFactory rf = new RenFactory(); Ren nan = rf.createRen("male"); Ren nv = rf.createRen("female"); Ren ry = rf.createRen("renyao");
}
}
但是此時我們的資深顧問提出了不同意見,現在我們兼並泰國的實驗室,我們需要一個人妖的生產線可以從泰國實驗室直接拿來用,但是我們的工廠系統卻也要更改,萬一那一部分錯誤,我們以前能制造的男人和女人也會出問題阿。況且聽說上層正在談收購太陽實驗室的事情,那么到時候我們豈不是又得更新我們的工廠系統了! 我們何不再多造幾個工廠來造不同的人,於是我們實驗室又提出了以下的方案:
創建一個工廠的樣板間以便其他工廠有個參照物
interface Factory { public abstract Ren createRen(String gender); }
保留我們以前生產正常人的工廠
class RenFactory implements Factory{ public Ren createRen(String gender) { Ren r = null; if (gender == "male") { r = new NanRen(); } else if (gender == "female") { r = new NvRen(); } return r; } }
再新建一座可以生產人妖的人妖工廠
class RenYaoFactory implements Factory{ public Ren createRen(String gender) { Ren r = new RenYao(); //人妖是不在乎性別的 return r; } }
所以當我們實驗室就可以很順利的經行生產了
public class Laboratory { public static void main(String[] args) { Factory rf = new RenFactory(); Ren nan = rf.createRen("male"); Ren nv = rf.createRen("female"); Factory ryf = new RenYaoFactory(); Ren ry = ryf.createRen(null); } }
並且在一段時候后我們實驗室成功兼並了太陽實驗室,並在太陽當地設置了我們的獸人工廠。

class Ren { } class NanRen extends Ren { } class NvRen extends Ren { } class RenYao extends Ren { } class ShouRen extends Ren { } interface Factory { public abstract Ren createRen(String gender); } class RenFactory implements Factory { public Ren createRen(String gender) { Ren r = null; if (gender == "male") { r = new NanRen(); } else if (gender == "female") { r = new NvRen(); } return r; } } class RenYaoFactory implements Factory { public Ren createRen(String gender) { Ren r = new RenYao(); // 人妖是不在乎性別的 return r; } } class ShouRenFactory implements Factory { public Ren createRen(String gender) { Ren r = new ShouRen(); // 獸人是雖然是有性別的,但是我們分不清~ return r; } } public class Laboratory { public static void main(String[] args) { Factory rf = new RenFactory(); Ren nan = rf.createRen("male"); Ren nv = rf.createRen("female"); Factory ryf = new RenYaoFactory(); Ren ry = ryf.createRen(null); Factory srf = new ShouRenFactory(); Ren sr = srf.createRen(null); } }
抽象工廠模式
自從我們成功兼並泰國和太陽兩家實驗室,我們實驗室反而陷入了虧損的泥潭,這只能說這是一個瘋狂的市場,因為我們的客戶不滿足我們出售的各種赤果果的人,竟然還想讓他們穿上衣服。為了我們偉大的市場,我們實驗室只能再次收購了衣服加工廠,並且根據生產人的經驗,我們分別為正常人,人妖,獸人建立了不同的衣服廠。
class YiFu { } class NanRenYiFu extends YiFu { } class NvRenYiFu extends YiFu { } class RenYaoYiFu extends YiFu { } class ShouRenYiFu extends YiFu { } interface YiFuFactory { public abstract YiFu createYiFu(String gender); } class RenYiFuFactory implements YiFuFactory { public YiFu createYiFu(String gender) { YiFu yf = null; if (gender == "male") { yf = new NanRenYiFu(); } else if (gender == "female") { yf = new NvRenYiFu(); } return yf; } } class RenYaoYiFuFactory implements YiFuFactory { public YiFu createYiFu(String gender) { YiFu yf = new RenYaoYiFu(); return yf; } } class ShouRenYiFuFactory implements YiFuFactory { public YiFu createYiFu(String gender) { YiFu yf = new ShouRenYiFu(); return yf; } }
我們以為有着以前的經驗,加個衣服廠肯定是簡單的事情,但是當我們將我們的產品投放市場的時候,發現常常將人妖穿的衣服給獸人穿上了,獸人的衣服卻給人妖穿上了。我們的特殊愛好客戶完全受不了穿着齊X小短裙的獸人。
public class Laboratory { public static void main(String[] args) { Factory rf = new RenFactory(); Ren nan = rf.createRen("male"); Ren nv = rf.createRen("female"); //人妖穿上了獸人的露胸皮坎肩 Factory ryf = new RenYaoFactory(); Ren ry = ryf.createRen(null); YiFuFactory sryff = new ShouRenYiFuFactory(); YiFu ryyf = sryff.createYiFu(null); //獸人穿上了人妖的齊X小短裙 Factory srf = new ShouRenFactory(); Ren sr = srf.createRen(null); YiFuFactory ryyff = new RenYaoYiFuFactory(); YiFu sryf = ryyff.createYiFu(null); } }
為了解決問題,我們的資深顧問提出了新的建議:我們再新建幾座組裝工廠。
interface ZuZhuangFactory { public abstract Factory createFactory(); public abstract YiFuFactory createYiFuFactory(); } class RenZuZhuangFactory implements ZuZhuangFactory { public Factory createFactory() { return new RenFactory(); } public YiFuFactory createYiFuFactory() { return new RenYiFuFactory(); } } class RenYaoZuZhuangFactory implements ZuZhuangFactory { public Factory createFactory() { return new RenYaoFactory(); } public YiFuFactory createYiFuFactory() { return new RenYaoYiFuFactory(); } } class ShouRenZuZhuangFactory implements ZuZhuangFactory { public Factory createFactory() { return new ShouRenFactory(); } public YiFuFactory createYiFuFactory() { return new ShouRenYiFuFactory(); } }
現在實驗室就能正確的生產人和衣服也套件了
public class Laboratory { public static void main(String[] args) { ZuZhuangFactory zzf = new RenZuZhuangFactory(); Factory rf = zzf.createFactory(); YiFuFactory ryff = zzf.createYiFuFactory(); Ren nan = rf.createRen("male"); Ren nv = rf.createRen("female"); YiFu nanyf = ryff.createYiFu("male"); YiFu nvyf = ryff.createYiFu("female"); // 人妖組裝工廠里拿不到獸人的衣服 ZuZhuangFactory ryzzf = new RenYaoZuZhuangFactory(); Factory ryf = ryzzf.createFactory(); YiFuFactory ryyff = ryzzf.createYiFuFactory(); Ren ry = ryf.createRen(null); YiFu ryyf = ryyff.createYiFu(null); // 獸人組裝工廠里拿不到人妖的齊X小短裙 ZuZhuangFactory srzzf = new ShouRenZuZhuangFactory(); Factory srf = srzzf.createFactory(); YiFuFactory sryff = srzzf.createYiFuFactory(); Ren sr = srf.createRen(null); YiFu sryf = sryff.createYiFu(null); } }
以下是全部源碼

class Ren { } class NanRen extends Ren { } class NvRen extends Ren { } class RenYao extends Ren { } class ShouRen extends Ren { } interface Factory { public abstract Ren createRen(String gender); } class RenFactory implements Factory { public Ren createRen(String gender) { Ren r = null; if (gender == "male") { r = new NanRen(); } else if (gender == "female") { r = new NvRen(); } return r; } } class RenYaoFactory implements Factory { public Ren createRen(String gender) { Ren r = new RenYao(); // 人妖是不在乎性別的 return r; } } class ShouRenFactory implements Factory { public Ren createRen(String gender) { Ren r = new ShouRen(); // 獸人是雖然是有性別的,但是我們分不清~ return r; } } class YiFu { } class NanRenYiFu extends YiFu { } class NvRenYiFu extends YiFu { } class RenYaoYiFu extends YiFu { } class ShouRenYiFu extends YiFu { } interface YiFuFactory { public abstract YiFu createYiFu(String gender); } class RenYiFuFactory implements YiFuFactory { public YiFu createYiFu(String gender) { YiFu yf = null; if (gender == "male") { yf = new NanRenYiFu(); } else if (gender == "female") { yf = new NvRenYiFu(); } return yf; } } class RenYaoYiFuFactory implements YiFuFactory { public YiFu createYiFu(String gender) { YiFu yf = new RenYaoYiFu(); return yf; } } class ShouRenYiFuFactory implements YiFuFactory { public YiFu createYiFu(String gender) { YiFu yf = new ShouRenYiFu(); return yf; } } interface ZuZhuangFactory { public abstract Factory createFactory(); public abstract YiFuFactory createYiFuFactory(); } class RenZuZhuangFactory implements ZuZhuangFactory { public Factory createFactory() { return new RenFactory(); } public YiFuFactory createYiFuFactory() { return new RenYiFuFactory(); } } class RenYaoZuZhuangFactory implements ZuZhuangFactory { public Factory createFactory() { return new RenYaoFactory(); } public YiFuFactory createYiFuFactory() { return new RenYaoYiFuFactory(); } } class ShouRenZuZhuangFactory implements ZuZhuangFactory { public Factory createFactory() { return new ShouRenFactory(); } public YiFuFactory createYiFuFactory() { return new ShouRenYiFuFactory(); } } public class Laboratory { public static void main(String[] args) { ZuZhuangFactory zzf = new RenZuZhuangFactory(); Factory rf = zzf.createFactory(); YiFuFactory ryff = zzf.createYiFuFactory(); Ren nan = rf.createRen("male"); Ren nv = rf.createRen("female"); YiFu nanyf = ryff.createYiFu("male"); YiFu nvyf = ryff.createYiFu("female"); // 人妖組裝工廠里拿不到獸人的衣服 ZuZhuangFactory ryzzf = new RenYaoZuZhuangFactory(); Factory ryf = ryzzf.createFactory(); YiFuFactory ryyff = ryzzf.createYiFuFactory(); Ren ry = ryf.createRen(null); YiFu ryyf = ryyff.createYiFu(null); // 獸人組裝工廠里拿不到人妖的齊X小短裙 ZuZhuangFactory srzzf = new ShouRenZuZhuangFactory(); Factory srf = srzzf.createFactory(); YiFuFactory sryff = srzzf.createYiFuFactory(); Ren sr = srf.createRen(null); YiFu sryf = sryff.createYiFu(null); } }
到這一步我們的市場基本就能穩定下來了,也需你也可以給我們的產品附送一頂帽子,試試看吧!
總結
簡單工廠模式最簡單,我們只有一個工廠類,根據不同的需求返回不同的產品實例。
工廠方法模式是我們有一系列類似的工廠,客戶可以根據不同的需求構建不同的工廠來生產產品。
抽象工廠模式是工廠方法模式的進一步抽象:我們有一系列類似的工廠,這些工廠的產品是一些工廠族。