摘要:工廠模式就是用來創(chuàng)建對(duì)象,生產(chǎn)對(duì)象的。而現(xiàn)在,其全部依賴于工廠類,通過一個(gè)工廠類,實(shí)現(xiàn)解耦。應(yīng)用實(shí)例實(shí)際設(shè)計(jì)中,工廠模式用的也是比較多,而且這種模式也會(huì)比較好辨識(shí),帶有。
目錄
工廠模式
為什么使用工廠模式
應(yīng)用實(shí)例
工廠模式工廠模式:是一種常用的對(duì)象創(chuàng)建型設(shè)計(jì)模式,此模式的核心精神是封裝類中不變的部分,提取其中個(gè)性化善變的部分為獨(dú)立類,通過依賴注入以達(dá)到解耦、復(fù)用和方便后期維護(hù)拓展的目的。它的核心結(jié)構(gòu)有四個(gè)角色,分別是抽象工廠;具體工廠;抽象產(chǎn)品;具體產(chǎn)品
這里所提到的依賴注入,對(duì)于依賴的創(chuàng)建思想又引出一個(gè)概念:依賴倒置即為高層組件不再依賴底層組件,而底層組件也不再依賴高層組件,而是出現(xiàn)一個(gè)工廠類,高底層組建依賴于這個(gè)工廠類。下面針對(duì)具體的例子來進(jìn)行講解。
為什么使用工廠模式工廠,生產(chǎn)物品的地方。工廠模式就是用來創(chuàng)建對(duì)象,生產(chǎn)對(duì)象的。一般,我們會(huì)通過new來進(jìn)行對(duì)象的創(chuàng)建,一旦通過new,那么就一定會(huì)有具體的實(shí)例出現(xiàn),也就會(huì)使得該對(duì)象和當(dāng)前類出現(xiàn)緊耦合,產(chǎn)生依賴,使得我們代碼的可擴(kuò)展性和靈活性都變低。繼續(xù)我們上篇文章中工廠生產(chǎn)機(jī)器的例子。
//機(jī)器裝配的基類 public abstract class Machine{ //機(jī)器裝配的流程,final不可被復(fù)寫,保證方裝配算法不被破壞 final void produce(){ createFrame(); addHead(); addBody(); if(ifDressup()) dressUp(); } //創(chuàng)建框架 public abstract void createFrame(); //添加一個(gè)機(jī)器頭 public abstract void addHead(); //添加一個(gè)機(jī)器的身子 public abstract void addBody(); //為機(jī)器進(jìn)行裝扮 public abstract void dressUp(); //判斷是否為該機(jī)器進(jìn)行裝扮 public boolean ifDressup(){ return true; } } //繼承自基類的一個(gè)子類 public class InflatableDoll extends Machine{ public void createFrame(){ System.out.println("This is a Frame"); } public void addBody(){ System.out.println("This is a body"); } public void dressUp(){ System.out.println("This is a beautiful cloth"); } }
這是我們通過模板方法創(chuàng)建來創(chuàng)建我們機(jī)器的一個(gè)例子,那么現(xiàn)在我們有了一個(gè)新的需求,我們要對(duì)這些所有的機(jī)器在出售的時(shí)候要進(jìn)行一個(gè)包裝,根據(jù)客戶點(diǎn)的類型,然后對(duì)其進(jìn)行相應(yīng)的包裝之后,然后才可以出售。不同機(jī)器的包裝流程大致相似的,所以我們可以這樣來寫我們的前臺(tái)銷售部門。
public class Store{ public void order(String type){ Machine machine; if(type=="inflatedoll"){ machine = new InflatableDoll(); }else if(type==""){ .... } machine.produce(); machine.firstPack(); machine.secondPack(); machine.thirdPack(); machine.fourthPack(); } } public class InflatableDoll extends Machine{ public void firstPack(){ System.out.prinltn("Add first pack to protect"); } public void secondPack(){ System.out.prinltn("Add second pack to protect"); } public void thirdPack(){ System.out.prinltn("Add third pack to protect"); } public void fourthPack(){ System.out.prinltn("Add fourth pack to protect"); } }
但是問題來了,當(dāng)我們的機(jī)器種類不斷增多,對(duì)于機(jī)器類型的判斷,然后創(chuàng)建會(huì)使得我們的代碼變得很繁瑣,而且靈活性很差,按照設(shè)計(jì)模式的原則,封裝變化的,我們將對(duì)與機(jī)器類型的判斷和機(jī)器的創(chuàng)建封裝起來,我們?cè)撨@個(gè)封裝起來的類起了個(gè)名字叫做工廠類,因?yàn)檫@個(gè)工廠類是可以用來產(chǎn)生新的對(duì)象的。封裝代碼如下。
public class MachineFactory{ public Machine create(String type){ Machine machine; if(type=="inflatabledoll"){ machine = new InflatableDoll(); }else if(){ do something; } machine.produce(); return machine; } }
通過這個(gè)工廠類,我們的商店出售類就可以改變了,和具體的機(jī)器實(shí)例實(shí)現(xiàn)解耦和。
public class Store{ Store(){ MachineFactory factory = new MachineFactory(); } public void order(String type){ Machine machine= factory.create(type); machine.firstPack(); machine.secondPack(); machine.thirdPack(); machine.fourthPack(); } }
頓時(shí)就感覺代碼簡潔了好多,而且條理也變得很清晰了。
通過例子,再去對(duì)我們之前的概念去理解,就會(huì)變得清晰很多,抽象工廠,具體工廠,抽象產(chǎn)品,具體產(chǎn)品。依賴注入,依賴倒置。首先對(duì)于抽象工廠和具體的工廠的理解,因?yàn)槲覀儾煌漠a(chǎn)品可能在其生產(chǎn)上還是存在一些差異,所以通過一個(gè)抽象工廠類作為基類,然后針對(duì)不同的地方分別建立不同的類,根據(jù)這些類,我們來創(chuàng)建我們相應(yīng)的產(chǎn)品,為了實(shí)現(xiàn)商店類和產(chǎn)品的松耦合,我們定義一個(gè)抽象產(chǎn)品類,然后所有的產(chǎn)品都將從這個(gè)抽象類繼承,然后實(shí)現(xiàn)自己的相應(yīng)的方法,然后通過一個(gè)工廠類工廠方法注入實(shí)例,實(shí)例以委托的形式,來執(zhí)行相應(yīng)的操作。
依賴倒置:按照我們的傳統(tǒng)思路,我們商店要出售商品,那么我們的商店就要依賴商品,而這里我們從底層的角度去向高層進(jìn)階,我們有商品,商品的創(chuàng)建需要一個(gè)工廠類,而商店類,則不再依賴于產(chǎn)品,產(chǎn)品也不再依賴于商店類,我們的第一種寫法,在商店類中對(duì)于我們要?jiǎng)?chuàng)建的類進(jìn)行的判斷,我們就可以將其理解為商品對(duì)于商店類的依賴。而現(xiàn)在,其全部依賴于工廠類,通過一個(gè)工廠類,實(shí)現(xiàn)解耦。同時(shí)也使得之前的依賴出現(xiàn)了倒置,又高層依賴底層轉(zhuǎn)為底層依賴高層。
實(shí)際設(shè)計(jì)中,工廠模式用的也是比較多,而且這種模式也會(huì)比較好辨識(shí),帶有Factory。比如Android中的
public interface ThreadFactory { Thread newThread(Runnable r); }
下篇更新狀態(tài)模式
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/64623.html
摘要:本文一大半內(nèi)容都是通過舉例來讓讀者去理解什么是控制反轉(zhuǎn)和依賴注入,通過理解這些概念,來更加深入。這種由外部負(fù)責(zé)其依賴需求的行為,我們可以稱其為控制反轉(zhuǎn)。工廠模式,依賴轉(zhuǎn)移當(dāng)然,實(shí)現(xiàn)控制反轉(zhuǎn)的方法有幾種。 容器,字面上理解就是裝東西的東西。常見的變量、對(duì)象屬性等都可以算是容器。一個(gè)容器能夠裝什么,全部取決于你對(duì)該容器的定義。當(dāng)然,有這樣一種容器,它存放的不是文本、數(shù)值,而是對(duì)象、對(duì)象的描...
簡介 1.學(xué)習(xí)本篇文章,了解簡單工廠設(shè)計(jì)模式的使用場景。2.如何使用簡單工廠模式。3.簡單工廠模式能解決什么問題? 場景 現(xiàn)在有一家外賣小店需要從生產(chǎn)一份外賣開始進(jìn)行考慮設(shè)計(jì),當(dāng)客戶在網(wǎng)上點(diǎn)出不同味道的菜時(shí),外賣小店就將按照不同的訂單進(jìn)行生產(chǎn)出菜品,然后進(jìn)行打包、等待外賣小哥獲取、贈(zèng)送給客戶等不同的幾道工序,才算完成一單,但是后期由于生意很好,客戶評(píng)價(jià)很高,有些地方的老板想加盟本店了,那么可能就會(huì)...
摘要:工廠模式,依賴轉(zhuǎn)移當(dāng)然,實(shí)現(xiàn)控制反轉(zhuǎn)的方法有幾種。其實(shí)我們稍微改造一下這個(gè)類,你就明白,工廠類的真正意義和價(jià)值了。雖然如此,工廠模式依舊十分優(yōu)秀,并且適用于絕大多數(shù)情況。 此篇文章轉(zhuǎn)載自laravel-china,chongyi的文章https://laravel-china.org/top...原文地址: http://www.insp.top/learn-lar... ,轉(zhuǎn)載務(wù)必保...
摘要:我們今天也來做一個(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é)我們介紹了...
閱讀 2609·2021-09-28 09:35
閱讀 3262·2021-09-03 10:28
閱讀 2905·2019-08-30 15:43
閱讀 1477·2019-08-30 14:04
閱讀 1801·2019-08-29 17:02
閱讀 1812·2019-08-26 13:59
閱讀 692·2019-08-26 11:51
閱讀 3251·2019-08-23 17:16