簡(jiǎn)單工廠(chǎng)模式
工廠(chǎng)方法模式
抽象工廠(chǎng)模式
? 工廠(chǎng)顧名思義就是生產(chǎn)產(chǎn)品的意思,根據(jù)產(chǎn)品是具體產(chǎn)品還是具體工廠(chǎng)可分為簡(jiǎn)單工廠(chǎng)模式和工廠(chǎng)方法模式困檩,根據(jù)工廠(chǎng)的抽象程度可分為工廠(chǎng)方法模式和抽象工廠(chǎng)模式祠挫。該模式用于封裝和管理對(duì)象的創(chuàng)建,是一種創(chuàng)建型模式悼沿。
1. 簡(jiǎn)單工廠(chǎng)模式
? 首先等舔,我們有一個(gè)服裝制造廠(chǎng),有一張服裝設(shè)計(jì)原稿∠陨颍現(xiàn)在软瞎,我們需要根據(jù)各個(gè)經(jīng)銷(xiāo)商的要求制造出不同顏色的衣服。
-
Clothes接口:即服裝設(shè)計(jì)原稿
public interface Clothes { void getName(); }
-
BlueClothes類(lèi):根據(jù)圖紙制造出來(lái)的藍(lán)色的衣服
public class BlueClothes implements Clothes{ public void getName() { System.out.print("BlueClothes"); } }
-
RedClothes類(lèi):根據(jù)圖紙制造出來(lái)的藍(lán)色的衣服
public class RedClothes implements Clothes{ public void getName() { System.out.print("RedClothes"); } }
-
GreenClothes類(lèi):根據(jù)圖紙制造出來(lái)的藍(lán)色的衣服
public class GreenClothes implements Clothes{ public void getName() { System.out.print("GreenClothes"); } }
-
SimpleClothesFactory類(lèi):一個(gè)簡(jiǎn)單的服裝制造廠(chǎng)
public class SimpleClothesFactory { public Clothes CreateClothes(String orderColor) { Clothes Clothes = null; if (orderColor.equals("blue")) { Clothes = new BlueClothes(); } else if (orderColor.equals("red")) { Clothes = new RedClothes(); } else if (orderColor.equals("green")) { Clothes = new GreenClothes(); } return Clothes; } //開(kāi)工開(kāi)工 public static void main(String[] args) { SimpleClothesFactory scf = new SimpleClothesFactory(); scf.CreateClothes("red").getName(); //拿到紅色的訂單后拉讯,輸出"RedClothes" } }
簡(jiǎn)單工廠(chǎng)模式的優(yōu)點(diǎn):
- 工廠(chǎng)類(lèi)是整個(gè)模式的關(guān)鍵涤浇。包含了必要的邏輯判斷,根據(jù)外界給定的信息,決定究竟應(yīng)該創(chuàng)建哪個(gè)具體類(lèi)的對(duì)象魔慷。通過(guò)使用工廠(chǎng)類(lèi)只锭,外界可以從直接創(chuàng)建具體產(chǎn)品對(duì)象的尷尬局面擺脫出來(lái),僅僅需要負(fù)責(zé)“消費(fèi)”對(duì)象就可以了院尔。而不必管這些對(duì)象究竟如何創(chuàng)建及如何組織的蜻展。明確了各自的職責(zé)和權(quán)利,有利于整個(gè)軟件體系結(jié)構(gòu)的優(yōu)化邀摆。
簡(jiǎn)單工廠(chǎng)模式的缺點(diǎn):
- 由于工廠(chǎng)類(lèi)集中了所有實(shí)例的創(chuàng)建邏輯纵顾,違反了高內(nèi)聚責(zé)任分配原則,將全部創(chuàng)建邏輯集中到了一個(gè)工廠(chǎng)類(lèi)中栋盹;它所能創(chuàng)建的類(lèi)只能是事先考慮到的施逾,如果需要添加新的類(lèi),則就需要改變工廠(chǎng)類(lèi)了例获。
- 當(dāng)系統(tǒng)中的具體產(chǎn)品類(lèi)不斷增多時(shí)候汉额,可能會(huì)出現(xiàn)要求工廠(chǎng)類(lèi)根據(jù)不同條件創(chuàng)建不同實(shí)例的需求。這種對(duì)條件的判斷和對(duì)具體產(chǎn)品類(lèi)型的判斷交錯(cuò)在一起榨汤,很難避免模塊功能的蔓延蠕搜,對(duì)系統(tǒng)的維護(hù)和擴(kuò)展非常不利。
- 這些缺點(diǎn)在工廠(chǎng)方法模式中得到了一定的克服收壕。
可以考慮的應(yīng)用場(chǎng)景:
- 工廠(chǎng)類(lèi)負(fù)責(zé)創(chuàng)建的對(duì)象比較少妓灌;
- 客戶(hù)只知道傳入工廠(chǎng)類(lèi)的參數(shù)轨蛤,對(duì)于如何創(chuàng)建對(duì)象(邏輯)不關(guān)心;
- 由于簡(jiǎn)單工廠(chǎng)很容易違反高內(nèi)聚責(zé)任分配原則虫埂,因此一般只在很簡(jiǎn)單的情況下應(yīng)用俱萍。
2. 工廠(chǎng)方法模式
? 那么問(wèn)題來(lái)了,在我們使用簡(jiǎn)單工廠(chǎng)模式時(shí)告丢,當(dāng)我們的服裝廠(chǎng)生意做大了,吸引了無(wú)數(shù)經(jīng)銷(xiāo)商前來(lái)訂單损谦,這時(shí)我們廠(chǎng)里只能生產(chǎn)紅岖免、綠、藍(lán)顏色的衣服照捡。如果我們想要接下這批訂單颅湘,那我們就要對(duì)原工廠(chǎng)進(jìn)行改造,那就會(huì)消耗大量的人力物力了栗精。這時(shí)闯参,工廠(chǎng)方法模式就登場(chǎng)了!
Clothes接口:服裝設(shè)計(jì)原稿
YellowClothes類(lèi):按稿件設(shè)計(jì)出來(lái)的黃色衣服
WhiteClothes類(lèi):按稿件設(shè)計(jì)出來(lái)的白色衣服
ClothesFactory接口:服裝廠(chǎng)原型悲立,建造具體服裝廠(chǎng)時(shí)的標(biāo)準(zhǔn)
YellowClothesFactory類(lèi):生產(chǎn)黃色衣服的工廠(chǎng)
WhiteClothesFactory類(lèi):生產(chǎn)白色衣服的工廠(chǎng)
-
Work類(lèi):工廠(chǎng)開(kāi)工(啟動(dòng)類(lèi))
interface Clothes{ void showTag(); } class YellowClothes implements Clothes{ public void showTag() { System.out.println("YellowClothes"); } } class WhiteClothes implements Clothes{ public void showTag() { System.out.println("WhiteClothes"); } } interface ClothesFactory{ public abstract Clothes produce(); } class YellowClothesFactory implements ClothesFactory{ public Clothes produce() { return new YellowClothes(); } } class WhiteClothesFactory implements ClothesFactory{ public Clothes produce() { return new WhiteClothes(); } } public class Work { public static void main(String[] args){ ClothesFactory ycf = new YellowClothesFactory(); ycf.produce().showTag(); //輸出YellowClothes ClothesFactory wcf = new WhiteClothesFactory(); wcf.produce().showTag(); //輸出WhiteClothes } }
? 如此這般鹿寨,在我們接受到新訂單時(shí)我們只需要新建一個(gè)小工廠(chǎng)就可以了。不需要對(duì)建好的工廠(chǎng)進(jìn)行改造薪夕。它能更好的符合開(kāi)閉原則的要求脚草。
工廠(chǎng)方法模式的優(yōu)點(diǎn):
- 用戶(hù)只需要關(guān)心產(chǎn)品對(duì)應(yīng)的工廠(chǎng),甚至無(wú)需關(guān)心創(chuàng)建細(xì)節(jié)或具體產(chǎn)品類(lèi)的類(lèi)名原献。
- 基于工廠(chǎng)角色和產(chǎn)品的多態(tài)性設(shè)計(jì)是工廠(chǎng)模式的關(guān)鍵馏慨。它能自主決定如何創(chuàng)建哪種產(chǎn)品對(duì)象,而創(chuàng)建細(xì)節(jié)都封裝在具體工廠(chǎng)內(nèi)部姑隅。
- 在系統(tǒng)要添加新的產(chǎn)品時(shí)写隶,無(wú)需修改抽象工廠(chǎng)和抽象產(chǎn)品提供的接口,無(wú)需修改客戶(hù)端讲仰,也無(wú)需修改其他的具體工廠(chǎng)和具體產(chǎn)品慕趴,只要添加一個(gè)具體工廠(chǎng)和具體產(chǎn)品即可,從而提高系統(tǒng)的可擴(kuò)展性(符合開(kāi)閉原則)
工廠(chǎng)方法模式的缺點(diǎn):
- 在添加新產(chǎn)品時(shí)叮盘,要編寫(xiě)新的具體產(chǎn)品類(lèi)秩贰,并要提供與之對(duì)應(yīng)的具體工廠(chǎng)類(lèi)。系統(tǒng)軟件個(gè)數(shù)也成對(duì)增加柔吼,從而增加了系統(tǒng)的復(fù)雜度毒费,帶來(lái)更多開(kāi)銷(xiāo)。
- 由于系統(tǒng)的可擴(kuò)展性愈魏,在客戶(hù)端中要引入抽象層進(jìn)行定義觅玻,從而增加了系統(tǒng)的抽象性和理解難度想际。
3. 抽象工廠(chǎng)模式
? 工廠(chǎng)模式中的每一個(gè)形態(tài)都是針對(duì)一定問(wèn)題的解決方案,工廠(chǎng)方法針對(duì)的是多個(gè)產(chǎn)品系列結(jié)構(gòu)溪厘;而抽象工廠(chǎng)模式針對(duì)的是多個(gè)產(chǎn)品族結(jié)構(gòu)胡本,一個(gè)產(chǎn)品族內(nèi)有多個(gè)產(chǎn)品系列。
讓我們回到我們的服裝廠(chǎng)繼續(xù)分析畸悬,現(xiàn)在侧甫,我們已經(jīng)不滿(mǎn)足于衣服業(yè)務(wù)啦,我們要進(jìn)軍褲子生產(chǎn)屆蹋宦,那么問(wèn)題來(lái)了披粟,我們只有衣服生產(chǎn)廠(chǎng),怎么辦呢冷冗?我們現(xiàn)在迫切需要一種多個(gè)產(chǎn)品族結(jié)構(gòu)的解決方案守屉。
Clothes接口:衣服設(shè)計(jì)原稿
YellowClothes類(lèi):按稿件設(shè)計(jì)出來(lái)的黃色衣服
WhiteClothes類(lèi):按稿件設(shè)計(jì)出來(lái)的白色衣服
Trousers接口:褲子設(shè)計(jì)原稿
YellowTrousers類(lèi):按稿件設(shè)計(jì)出來(lái)的黃色褲子
WhiteTrousers類(lèi):按稿件設(shè)計(jì)出來(lái)的白色褲子
AbstractFactory抽象類(lèi):服裝廠(chǎng)原型,建造具體服裝廠(chǎng)時(shí)的標(biāo)準(zhǔn)
YellowFactory類(lèi):擁有黃色原料的工廠(chǎng)
WhiteFactory類(lèi):擁有白色原料的工廠(chǎng)
-
Work類(lèi):工廠(chǎng)開(kāi)工(啟動(dòng)類(lèi))
//衣服原稿 interface Clothes{ void showClothesTag(); } //褲子原稿 interface Trousers{ void showTrousersTag(); } //衣服原稿制作出來(lái)的黃色衣服 class YellowClothes implements Clothes{ public void showClothesTag() { System.out.println("YellowClothes"); } } //衣服原稿制作出來(lái)的白色衣服 class WhiteClothes implements Clothes{ public void showClothesTag() { System.out.println("WhiteClothes"); } } //衣服原稿制作出來(lái)的黃色褲子 class YellowTrousers implements Trousers{ public void showTrousersTag() { System.out.println("YellowTrousers"); } } //衣服原稿制作出來(lái)的白色褲子 class WhiteTrousers implements Trousers{ public void showTrousersTag() { System.out.println("WhiteTrousers"); } } //能生產(chǎn)衣服和褲子的工廠(chǎng) abstract class AbstractFactory{ public abstract Clothes produceClothes(); public abstract Trousers produceTrousers(); } //擁有黃色原料的工廠(chǎng) class YellowFactory extends AbstractFactory{ public Clothes produceClothes() { return new YellowClothes(); } public Trousers produceTrousers() { return new YellowTrousers(); } } //擁有白色原料的工廠(chǎng) class WhiteFactory extends AbstractFactory{ public Clothes produceClothes() { return new WhiteClothes(); } public Trousers produceTrousers() { return new WhiteTrousers(); } } //啟動(dòng)類(lèi) public class Work { public static void main(String[] args) { AbstractFactory yf = new YellowFactory(); AbstractFactory wf = new WhiteFactory(); System.out.println("黃色原料工廠(chǎng)正在生產(chǎn):"); yf.produceClothes().showClothesTag(); yf.produceTrousers().showTrousersTag(); System.out.println("白色原料工廠(chǎng)正在生產(chǎn):"); wf.produceClothes().showClothesTag(); wf.produceTrousers().showTrousersTag(); } }
如此這般蒿辙,我們就可以正式進(jìn)軍褲子制造屆啦拇泛。
抽象工廠(chǎng)模式的優(yōu)點(diǎn):
- 分離了具體的類(lèi)∷脊啵客戶(hù)通過(guò)抽象接口操縱實(shí)例俺叭,產(chǎn)品的類(lèi)名也在具體工廠(chǎng)的實(shí)現(xiàn)中被分離,它們不出現(xiàn)在客戶(hù)代碼中习瑰。
- 易于交換產(chǎn)品系列绪颖。一個(gè)具體工廠(chǎng)類(lèi)只在初始化時(shí)出現(xiàn)一次,這使得改變一個(gè)應(yīng)用的具體工廠(chǎng)變得很容易甜奄,只需改變具體的工廠(chǎng)即可使用不同的產(chǎn)品配置柠横。
- 有利于產(chǎn)品的一致性。當(dāng)一個(gè)系列的產(chǎn)品對(duì)象被設(shè)計(jì)成一起工作時(shí)课兄,一個(gè)應(yīng)用一次只能使用同一個(gè)系列中的對(duì)象牍氛,這一點(diǎn)很重要,而抽象工廠(chǎng)很容易實(shí)現(xiàn)這一點(diǎn)烟阐。
抽象工廠(chǎng)模式的缺點(diǎn):
- 難以支持新種類(lèi)的產(chǎn)品搬俊。因?yàn)槌橄蠊S(chǎng)接口確定了可以被創(chuàng)建的產(chǎn)品集合,所以難以擴(kuò)展抽象工廠(chǎng)以生產(chǎn)新種類(lèi)的產(chǎn)品蜒茄。
可以考慮使用的場(chǎng)景:
- 一個(gè)系統(tǒng)要獨(dú)立于它的產(chǎn)品的創(chuàng)建唉擂、組合和表示時(shí)。
- 一個(gè)系統(tǒng)要由多個(gè)產(chǎn)品系列中的一個(gè)來(lái)配置時(shí)檀葛。
- 需要強(qiáng)調(diào)一系列相關(guān)的產(chǎn)品對(duì)象的設(shè)計(jì)以便進(jìn)行聯(lián)合使用時(shí)玩祟。
- 提供一個(gè)產(chǎn)品類(lèi)庫(kù),而只想顯示它們的接口而不是實(shí)現(xiàn)時(shí)屿聋。
以上就是我對(duì)這三個(gè)模式的簡(jiǎn)單認(rèn)識(shí)啦空扎,也是作為個(gè)人的學(xué)習(xí)總結(jié)藏鹊,僅供參考!
如有錯(cuò)誤转锈,萬(wàn)望指正盘寡。