摘要:工廠模式,又稱為工廠方法模式。工廠模式,也就是工廠方法模式是解決了簡單工廠要修改代碼的問題,他把對(duì)象的創(chuàng)建操作延遲到子類工廠中,這樣新增產(chǎn)品就不需要修改代碼。
簡單工廠其實(shí)并不是設(shè)計(jì)模式,只是一種編程習(xí)慣。
首先我們創(chuàng)建父類Cup,所有杯子類的父類。再創(chuàng)建它的子類BigCup和SmallCup類。
public abstract class Cup { public abstract void use(); } public class BigCup extends Cup { @Override public void use() { System.out.println("大杯裝500ml水"); } } public class SmallCup extends Cup { @Override public void use() { System.out.println("小杯裝100ml水"); } }
然后我們創(chuàng)建工廠類CupFactory,工廠里聲明了Cup引用,根據(jù)傳入的參數(shù)type來判斷生產(chǎn)什么類型的杯子,這樣外部只需要傳入類型就可以生成想要的類型的對(duì)象,現(xiàn)在運(yùn)行看一下結(jié)果,沒有問題。
public class CupFactory{ public Cup makeCup(String type){ Cup cup = null; if (type.equals("big")){ cup = new BigCup(); }else if (type.equals("small")){ cup = new SmallCup(); } return cup; } } public static void main(String[] args){ CupFactory cupFactory = new CupFactory(); Cup smallCup = cupFactory.makeCup("small"); smallCup.use(); Cup bigCup = cupFactory.makeCup("big"); bigCup.use(); }
結(jié)果:
小杯裝100ml水
大杯裝500ml水
簡單工廠雖然解決了一些問題但是當(dāng)我們的需要增加子類的時(shí)候就很麻煩了,需要修改工廠類里的代碼,違反了開放封閉原則,所以我們現(xiàn)在使用真正的工廠模式來解決這個(gè)問題。
工廠模式,又稱為工廠方法模式。定義了一個(gè)創(chuàng)建產(chǎn)品對(duì)象的工廠接口,將實(shí)際創(chuàng)建工作推遲到子類工廠當(dāng)中。
首先我們創(chuàng)建抽象類Tableware,代表所有餐具的父類,再創(chuàng)建一個(gè)抽象工廠類TablewareFactory,抽象工廠里面有抽象方法makeTableware來制造餐具。然后我們創(chuàng)建4個(gè)餐具子類,分別是BigBowl、SmallBowl、BigCuphe和SmallCup。
public abstract class Tableware { public abstract void use(); } public abstract class TableWareFactory { public abstract Tableware makeTableware(String type); } public class BigBowl extends Tableware { @Override public void use() { System.out.println("大碗裝500g飯"); } } public class SmallBowl extends Tableware { @Override public void use() { System.out.println("小碗裝100g飯"); } } public class BigCup extends Tableware { @Override public void use() { System.out.println("大杯裝500ml水"); } } public class SmallCup extends Tableware { @Override public void use() { System.out.println("小杯裝100ml水"); } }
接下來我們需要實(shí)現(xiàn)工廠類了,這是最關(guān)鍵的部分,從上述4個(gè)子類可以看出,BigBowl和SmallBowl是一類產(chǎn)品,而BigCup和SamllCup是另一類,所以我們創(chuàng)建兩個(gè)子類工廠,分別是BowlFactory和CupFactory。它們生產(chǎn)不同的產(chǎn)品,但是又能根據(jù)參數(shù)來生產(chǎn)不同規(guī)格的同類產(chǎn)品。在子類工廠中的makeTableware方法才是決定生產(chǎn)什么產(chǎn)品,而父類工廠并不知道,這就是將實(shí)際創(chuàng)建工作推遲到子類工廠當(dāng)中。當(dāng)我們想要新建別的產(chǎn)品的時(shí)候增加新的子類工廠即可。
public class BowlFactory extends TableWareFactory { @Override public Tableware makeTableware(String type) { Tableware tableware = null; if (type.equals("big")){ tableware = new BigBowl(); }else if (type.equals("small")){ tableware = new SmallBowl(); } return tableware; } } public class CupFactory extends TableWareFactory { @Override public Tableware makeTableware(String type) { Tableware tableware = null; if (type.equals("big")){ tableware = new BigCup(); }else if (type.equals("small")){ tableware = new SmallCup(); } return tableware; } }
測試一下看看結(jié)果,結(jié)果沒有問題。
TableWareFactory cupFactory = new CupFactory(); Tableware bigCup = cupFactory.makeTableware("big"); bigCup.use(); Tableware smallCup = cupFactory.makeTableware("small"); smallCup.use(); TableWareFactory bowlFactory = new BowlFactory(); Tableware bigBowl = bowlFactory.makeTableware("big"); bigBowl.use(); Tableware smallBowl = bowlFactory.makeTableware("small"); smallBowl.use();
結(jié)果:
大杯裝500ml水
小杯裝100ml水
大碗裝500g飯
小碗裝100g飯
抽象工廠模式其實(shí)是在工廠方法模式的基礎(chǔ)上加入了產(chǎn)品族的概念,也就是工廠里會(huì)生產(chǎn)多種產(chǎn)品,他們需要配套使用,例如衣服和褲子。
我們先創(chuàng)建一個(gè)抽象工廠BaseFactory類,有兩個(gè)抽象方法makeTableware和getFood,分別生產(chǎn)餐具和食物,因?yàn)樗鼈儍蓚€(gè)是要配合使用的。
public abstract class BaseFactory { public abstract Tableware makeTableware(); public abstract Food getFood(); }
然后我們創(chuàng)建餐具的抽象父類Tableware和事物的抽象父類Food,再創(chuàng)建它們的子類BigBowl、SmallCup、Meat和Milk類。
public abstract class Tableware { public abstract void use(); } public abstract class Food { public abstract void name(); } public class BigBowl extends Tableware { @Override public void use() { System.out.println("500ml的大碗"); } } public class SmallCup extends Tableware { @Override public void use() { System.out.println("100ml的小杯子"); } } public class Meat extends Food { @Override public void name() { System.out.println("肉"); } } public class Milk extends Food { @Override public void name() { System.out.println("牛奶"); } }
接下來我們創(chuàng)建兩個(gè)子類工廠MeatWithBowlFactory和MilkWithCupFactory
類,這兩個(gè)類把肉和碗分到一個(gè)工廠里,牛奶和杯子分到一個(gè)工廠里,表示他們需要配套使用。這里的makeTableware和getFood方法也可以像上面工廠方法模式里一樣接受參數(shù)生成不同規(guī)格的產(chǎn)品,現(xiàn)在是直接返回一個(gè)對(duì)象。
public class MeatWithBowlFactory extends BaseFactory { @Override public Tableware makeTableware() { return new BigBowl(); } @Override public Food getFood() { return new Meat(); } } public class MilkWithCupFactory extends BaseFactory{ @Override public Tableware makeTableware() { return new SmallCup(); } @Override public Food getFood() { return new Milk(); } }
現(xiàn)在測試一下結(jié)果,沒有問題,同一個(gè)工廠可以生產(chǎn)需要配套的產(chǎn)品。
BaseFactory baseFactory; baseFactory = new MeatWithBowlFactory(); BigBowl bigBowl = (BigBowl) baseFactory.makeTableware(); bigBowl.use(); Meat meat = (Meat)baseFactory.getFood(); meat.name(); baseFactory = new MilkWithCupFactory(); SmallCup smallCup = (SmallCup) baseFactory.makeTableware(); smallCup.use(); Milk milk = (Milk)baseFactory.getFood(); milk.name();
結(jié)果:
500ml的大碗
肉
100ml的小杯子
牛奶
總結(jié):
簡單工廠模式其實(shí)只是把創(chuàng)建對(duì)象這個(gè)常用的工廠做成工廠類方便調(diào)用,但是修改的時(shí)候需要修改工廠的代碼,只是一種編程習(xí)慣,不是設(shè)計(jì)模式。
工廠模式,也就是工廠方法模式是解決了簡單工廠要修改代碼的問題,他把對(duì)象的創(chuàng)建操作延遲到子類工廠中,這樣新增產(chǎn)品就不需要修改代碼。
抽象工廠模式就是在工廠方法模式的基礎(chǔ)上加入了產(chǎn)品族的概念,如果幾個(gè)產(chǎn)品需要配套使用,就可以將他們放在同一個(gè)工廠里自行選擇搭配,比如牛肉放在瓷碗里,豬肉放在鐵碗里。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/69069.html
摘要:參考文章深入理解三種工廠模式工廠模式,工廠方法模式,抽象工廠模式詳解工廠模式是中最常用的設(shè)計(jì)模式之一。這種類型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對(duì)象的最佳方式。 參考文章:深入理解java三種工廠模式工廠模式,工廠方法模式,抽象工廠模式 詳解 工廠模式(Factory Pattern)是 Java 中最常用的設(shè)計(jì)模式之一。這種類型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對(duì)象的...
摘要:強(qiáng)大的表單驗(yàn)證前端掘金支持非常強(qiáng)大的內(nèi)置表單驗(yàn)證,以及。面向?qū)ο蠛兔嫦蜻^程的區(qū)別的種設(shè)計(jì)模式全解析后端掘金一設(shè)計(jì)模式的分類總體來說設(shè)計(jì)模式分為三大類創(chuàng)建型模式,共五種工廠方法模式抽象工廠模式單例模式建造者模式原型模式。 強(qiáng)大的 Angular 表單驗(yàn)證 - 前端 - 掘金Angular 支持非常強(qiáng)大的內(nèi)置表單驗(yàn)證,maxlength、minlength、required 以及 patt...
摘要:推文經(jīng)典設(shè)計(jì)模式之五大創(chuàng)建型模式附實(shí)例和詳解工廠三兄弟之簡單工廠模式一建造者模式概述手牽手一步兩步三步四步望著天。一步步構(gòu)建復(fù)雜對(duì)象推文設(shè)計(jì)模式二建造者模式建造者模式原型模式概述聽我說中藥苦,抄襲應(yīng)該更苦。 單例模式 概述: 你是我唯一想要的了解?!镀呃锵恪?有且僅有一個(gè)實(shí)例,與能訪問它的全局靜態(tài)方法。 實(shí)現(xiàn):餓漢、懶漢、雙重鎖、靜態(tài)內(nèi)部類、枚舉。 難點(diǎn):在考慮線程安全、序列化、反射、...
摘要:我們今天也來做一個(gè)萬能遙控器設(shè)計(jì)模式適配器模式將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。今天要介紹的仍然是創(chuàng)建型設(shè)計(jì)模式的一種建造者模式。設(shè)計(jì)模式的理論知識(shí)固然重要,但 計(jì)算機(jī)程序的思維邏輯 (54) - 剖析 Collections - 設(shè)計(jì)模式 上節(jié)我們提到,類 Collections 中大概有兩類功能,第一類是對(duì)容器接口對(duì)象進(jìn)行操作,第二類是返回一個(gè)容器接口對(duì)象,上節(jié)我們介紹了...
閱讀 1184·2023-04-26 00:34
閱讀 3360·2023-04-25 16:47
閱讀 2128·2021-11-24 11:14
閱讀 3109·2021-09-26 09:55
閱讀 3729·2019-08-30 15:56
閱讀 3223·2019-08-29 16:57
閱讀 1913·2019-08-26 13:38
閱讀 2672·2019-08-26 12:22