摘要:主要詳解簡(jiǎn)單工廠模式到抽象工廠模式的演變。抽象工廠模式當(dāng)一個(gè)類別的產(chǎn)品還有多個(gè)系列區(qū)分時(shí),為了按系列生產(chǎn)商品,使用抽象工廠區(qū)分。
主要詳解簡(jiǎn)單工廠模式到抽象工廠模式的演變。
簡(jiǎn)單工廠模式即靜態(tài)工廠模式
1.將對(duì)象的創(chuàng)建和使用分開;
2.將生產(chǎn)過程集中,便于集中管理;
3.當(dāng)需要?jiǎng)?chuàng)建的對(duì)象類有變動(dòng)時(shí),就不用在所有new 的地方修改了,直接修改工廠類即可;
/** * 簡(jiǎn)單工廠模式 --- 靜態(tài)工廠模式 */ public class StaticFactory { public static final int TYPE_APPLE = 1;//蘋果 public static final int TYPE_ORANGE = 2;//桔子 public static final int TYPE_BANANA = 3;//香蕉 public static Fruit getFruit(int type){ if(TYPE_APPLE == type){ return new Apple(); } else if(TYPE_ORANGE == type){ return new Orange("Peter",80); } else if(TYPE_BANANA == type){ return new Banana(); } return null; } /** * 多方法工廠 * @return */ public static Fruit getFruitApple(){ return new Apple(); } public static Fruit getFruitOrange(){ return new Orange("Peter",80); } public static Fruit getFruitBanana(){ return new Banana(); } }
總的來說,簡(jiǎn)單工廠模式就是用一個(gè)專業(yè)類(工廠類)來負(fù)責(zé)一種產(chǎn)品(水果類)的對(duì)象創(chuàng)建
簡(jiǎn)單工廠模式不屬于23種設(shè)計(jì)模式,是工廠模式的基礎(chǔ).
思考?若工廠生產(chǎn)的產(chǎn)品越來越多,靜態(tài)工廠不斷修改,方法擴(kuò)展極為龐大,產(chǎn)品品種擴(kuò)展不優(yōu)雅.
1.不符合單一職責(zé)原則:一個(gè)類負(fù)責(zé)了各類水果的創(chuàng)建.
2.不符合開閉原則:擴(kuò)展品種時(shí),需要修改已有代碼,修改工廠類.
工廠方法模式為了解決靜態(tài)工廠的問題,我們采用工廠方法模式
1.將靜態(tài)工廠打散,每一個(gè)水果品類,對(duì)應(yīng)一個(gè)水果品類工廠來生產(chǎn)。
2.當(dāng)需要擴(kuò)展水果品類時(shí),對(duì)應(yīng)擴(kuò)展一個(gè)水果品種的工廠即可。
將工廠類抽象出一個(gè)接口,對(duì)象的創(chuàng)建方法延遲到工廠子類去實(shí)現(xiàn).
/** * 工廠方法接口 */ public interface FruitFactory { public Fruit getFruit();//摘水果指令 } /** * 橘子工廠子類 */ public class OrangeFactory implements FruitFactory{ public Fruit getFruit(){ return new Orange("Peter",80); } } /** * 香蕉工廠子類 */ public class BananaFactory implements FruitFactory{ public Fruit getFruit(){ return new Banana(); } } /** * 蘋果工廠子類 */ public class AppleFactory implements FruitFactory{ public Fruit getFruit(){ return new Apple(); } } /** * 水果獲取測(cè)試 * */ public class FruitTest { private static FruitFactory fruitFactory; public static void main(String[] args) { getFruit(); } /** * 獲得水果 */ public static void getFruit(){ //初始化蘋果工廠 fruitFactory = new AppleFactory(); Fruit fruit = fruitFactory.getFruit(); fruit.draw(); //初始化香蕉工廠 fruitFactory = new BananaFactory (); Fruit bananafruit = fruitFactory.getFruit(); bananafruit.draw(); //想要獲取什么水果就實(shí)例化哪個(gè)工廠 } }
通過工廠方法模式,解決了單一職責(zé)和開閉原則問題。
需要具體的產(chǎn)品則初始化對(duì)應(yīng)的工廠,在spring中經(jīng)常是配置在配置文件中,
//然后注入進(jìn)去,面向接口編程我們注入的是接口實(shí)現(xiàn)類在配置里 @Autowired private FruitFactory fruitFactory;為什么使用抽象工廠模式
業(yè)務(wù)慢慢發(fā)展,現(xiàn)在水果店品種增加,那我們按著工廠方法模式新增其他工廠實(shí)現(xiàn)類。
現(xiàn)在除了賣水果的服務(wù)還要提供額外服務(wù),比如要包裝好,同樣的我們就新建一個(gè)包裝工廠接口如下BagFactory負(fù)責(zé)打包。
/** * 工廠方法模式 */ public interface BagFactory { public Bag getBag();//打包指令 } /** * 負(fù)責(zé)香蕉的打包 */ public class BananaBagFactory implements BagFactory{ public Bag getBag(){ return new BananaBag(); } } /** * 負(fù)責(zé)蘋果的打包 */ public class AppleBagFactory implements BagFactory{ public Bag getBag(){ return new AppleBag(); } }
一個(gè)水果店的動(dòng)作,就有從工廠獲取水果,然后從工廠獲取打包服務(wù),如下:
/** * 水果店測(cè)試 * Created by Peter on 10/8 008. */ public class FruitStoreTest { private static FruitFactory fruitFactory; private static BagFactory bagFactory; public static void main(String[] args) { pack(); } /** * 郵寄打包 */ public static void pack(){ //初始化蘋果工廠 fruitFactory = new AppleFactory();//獵取工廠不對(duì)應(yīng) Fruit fruit = fruitFactory.getFruit(); fruit.draw(); //初始化蘋果包裝工廠 bagFactory = new BananaBagFactory(); Bag bag = bagFactory.getBag(); bag.pack(); //....郵寄業(yè)務(wù) }
產(chǎn)品類圖如下:
同樣的,要是再加一個(gè)郵寄業(yè)務(wù),我們也是同樣的新增一個(gè)郵寄工廠。
問題? 在實(shí)際寫代碼的時(shí)候是否會(huì)發(fā)生這種問題: 即獵取工廠不對(duì)應(yīng)
1.初始化蘋果工廠獲取蘋果
2.初始化香蕉工廠來做包裝業(yè)務(wù)
3.初始化別的郵寄工廠來做郵寄服務(wù)
抽象工廠模式針對(duì)上面的問題就要用到我們的抽象工廠模式了。
抽象工廠模式:當(dāng)一個(gè)類別的產(chǎn)品還有多個(gè)系列區(qū)分時(shí),為了按系列生產(chǎn)商品,使用抽象工廠區(qū)分。
比如不同水果有不同包裝規(guī)格,客戶下單時(shí),自動(dòng)配出包裝,
--生產(chǎn)蘋果,配置紙箱包裝
--生產(chǎn)香蕉時(shí),配置竹蘿包裝
PS:保證客戶端只使用同一個(gè)產(chǎn)品族中的對(duì)象(如下代碼的AppleFactory,BananaFactory)。
/** * 抽象水果工廠 */ public abstract class AbstractFactory { public abstract Fruit getFruit(); public abstract Bag getBag(); } /** * 水果工廠 */ public class AppleFactory extends AbstractFactory{ @Override public Fruit getFruit() { return new Apple(); } @Override public Bag getBag() { return new AppleBag(); } } /** * 水果工廠 */ public class BananaFactory extends AbstractFactory{ @Override public Fruit getFruit() { return new Banana(); } @Override public Bag getBag() { return new BananaBag(); } } /** * 抽象工廠模式測(cè)試 * 按訂單發(fā)送貨品給客戶 * Created by Peter on 10/8 008. */ public class OrderSendClient { public static void main(String[] args){ sendFruit(); } public static void sendFruit(){ //初始化工廠 AbstractFactory factory = new AppleFactory();//spring使用注入方式 //得到水果 Fruit fruit = factory.getFruit(); fruit.draw(); //得到包裝 Bag bag = factory.getBag(); bag.pack(); //以下物流運(yùn)輸業(yè)務(wù)。。。。 } }
抽象工廠模式類圖:
代碼地址:https://github.com/lovemumu/F...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/77719.html
摘要:相對(duì)于工廠模式,抽象工廠模式生產(chǎn)的對(duì)象更加具體,也更加豐富,但相對(duì)編碼也更加復(fù)雜。具體的抽象工廠模式的實(shí)現(xiàn)大家可以參考菜鳥教程。知道了工廠模式和抽象工廠模式的區(qū)別,請(qǐng)大家使用的時(shí)候應(yīng)該根據(jù)具體的情況進(jìn)行選擇。 大家好,今天給大家分享一些Spring的學(xué)習(xí)心得,在講Spring之前,先和大家分享Spring中核心的設(shè)計(jì)模式。 工廠模式 在聊概念之前我先問問大家:什么是工廠? 這個(gè)很簡(jiǎn)單,...
摘要:但本質(zhì)是,簡(jiǎn)單工廠并未嚴(yán)格遵循設(shè)計(jì)模式的開閉原則,當(dāng)需要增加新產(chǎn)品時(shí)也需要修改工廠代碼。但是工廠方法則嚴(yán)格遵守開閉原則,模式只負(fù)責(zé)抽象工廠接口,具體工廠交給客戶去擴(kuò)展。 最近開展了三次設(shè)計(jì)模式的公開課,現(xiàn)在來總結(jié)一下設(shè)計(jì)模式在PHP中的應(yīng)用,這是第二篇?jiǎng)?chuàng)建型模式之工廠模式。 設(shè)計(jì)模式的一般介紹在第一篇文章講了,這里就不重復(fù)。 工廠模式 實(shí)現(xiàn):定義一個(gè)用于創(chuàng)建對(duì)象的接口,讓子類決定實(shí)...
摘要:類圖上面的這張圖引用設(shè)計(jì)模式之禪關(guān)于抽象工廠的通用類圖,說實(shí)話,我覺得這張圖很難懂,不容易表述抽象工廠模式也或許是個(gè)人理解能力。 前言 關(guān)于抽象工廠模式,博主初學(xué)的時(shí)候是懵逼的,花了好大力氣才明白它與工廠模式的異同,不得不說理解能力還有待加強(qiáng)(~。~) 什么是抽象工廠模式 為創(chuàng)建一組相關(guān)或相互依賴的對(duì)象提供一個(gè)接口,而且無須指定它們的具體類。 讓我們?cè)倩仡櫹鹿S模式的定義: 定義一個(gè)用...
摘要:參考文章深入理解三種工廠模式工廠模式,工廠方法模式,抽象工廠模式詳解工廠模式是中最常用的設(shè)計(jì)模式之一。這種類型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對(duì)象的最佳方式。 參考文章:深入理解java三種工廠模式工廠模式,工廠方法模式,抽象工廠模式 詳解 工廠模式(Factory Pattern)是 Java 中最常用的設(shè)計(jì)模式之一。這種類型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對(duì)象的...
閱讀 2617·2023-04-25 22:09
閱讀 2848·2021-10-14 09:47
閱讀 1956·2021-10-11 11:10
閱讀 2696·2021-10-09 09:44
閱讀 3393·2021-09-22 14:57
閱讀 2507·2019-08-30 15:56
閱讀 1627·2019-08-30 15:55
閱讀 787·2019-08-30 14:13