摘要:工廠模式就是用來創建對象,生產對象的。而現在,其全部依賴于工廠類,通過一個工廠類,實現解耦。應用實例實際設計中,工廠模式用的也是比較多,而且這種模式也會比較好辨識,帶有。
目錄
工廠模式
為什么使用工廠模式
應用實例
工廠模式工廠模式:是一種常用的對象創建型設計模式,此模式的核心精神是封裝類中不變的部分,提取其中個性化善變的部分為獨立類,通過依賴注入以達到解耦、復用和方便后期維護拓展的目的。它的核心結構有四個角色,分別是抽象工廠;具體工廠;抽象產品;具體產品
這里所提到的依賴注入,對于依賴的創建思想又引出一個概念:依賴倒置即為高層組件不再依賴底層組件,而底層組件也不再依賴高層組件,而是出現一個工廠類,高底層組建依賴于這個工廠類。下面針對具體的例子來進行講解。
為什么使用工廠模式工廠,生產物品的地方。工廠模式就是用來創建對象,生產對象的。一般,我們會通過new來進行對象的創建,一旦通過new,那么就一定會有具體的實例出現,也就會使得該對象和當前類出現緊耦合,產生依賴,使得我們代碼的可擴展性和靈活性都變低。繼續我們上篇文章中工廠生產機器的例子。
//機器裝配的基類 public abstract class Machine{ //機器裝配的流程,final不可被復寫,保證方裝配算法不被破壞 final void produce(){ createFrame(); addHead(); addBody(); if(ifDressup()) dressUp(); } //創建框架 public abstract void createFrame(); //添加一個機器頭 public abstract void addHead(); //添加一個機器的身子 public abstract void addBody(); //為機器進行裝扮 public abstract void dressUp(); //判斷是否為該機器進行裝扮 public boolean ifDressup(){ return true; } } //繼承自基類的一個子類 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"); } }
這是我們通過模板方法創建來創建我們機器的一個例子,那么現在我們有了一個新的需求,我們要對這些所有的機器在出售的時候要進行一個包裝,根據客戶點的類型,然后對其進行相應的包裝之后,然后才可以出售。不同機器的包裝流程大致相似的,所以我們可以這樣來寫我們的前臺銷售部門。
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"); } }
但是問題來了,當我們的機器種類不斷增多,對于機器類型的判斷,然后創建會使得我們的代碼變得很繁瑣,而且靈活性很差,按照設計模式的原則,封裝變化的,我們將對與機器類型的判斷和機器的創建封裝起來,我們該這個封裝起來的類起了個名字叫做工廠類,因為這個工廠類是可以用來產生新的對象的。封裝代碼如下。
public class MachineFactory{ public Machine create(String type){ Machine machine; if(type=="inflatabledoll"){ machine = new InflatableDoll(); }else if(){ do something; } machine.produce(); return machine; } }
通過這個工廠類,我們的商店出售類就可以改變了,和具體的機器實例實現解耦和。
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(); } }
頓時就感覺代碼簡潔了好多,而且條理也變得很清晰了。
通過例子,再去對我們之前的概念去理解,就會變得清晰很多,抽象工廠,具體工廠,抽象產品,具體產品。依賴注入,依賴倒置。首先對于抽象工廠和具體的工廠的理解,因為我們不同的產品可能在其生產上還是存在一些差異,所以通過一個抽象工廠類作為基類,然后針對不同的地方分別建立不同的類,根據這些類,我們來創建我們相應的產品,為了實現商店類和產品的松耦合,我們定義一個抽象產品類,然后所有的產品都將從這個抽象類繼承,然后實現自己的相應的方法,然后通過一個工廠類工廠方法注入實例,實例以委托的形式,來執行相應的操作。
依賴倒置:按照我們的傳統思路,我們商店要出售商品,那么我們的商店就要依賴商品,而這里我們從底層的角度去向高層進階,我們有商品,商品的創建需要一個工廠類,而商店類,則不再依賴于產品,產品也不再依賴于商店類,我們的第一種寫法,在商店類中對于我們要創建的類進行的判斷,我們就可以將其理解為商品對于商店類的依賴。而現在,其全部依賴于工廠類,通過一個工廠類,實現解耦。同時也使得之前的依賴出現了倒置,又高層依賴底層轉為底層依賴高層。
實際設計中,工廠模式用的也是比較多,而且這種模式也會比較好辨識,帶有Factory。比如Android中的
public interface ThreadFactory { Thread newThread(Runnable r); }
下篇更新狀態模式
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/64623.html
摘要:本文一大半內容都是通過舉例來讓讀者去理解什么是控制反轉和依賴注入,通過理解這些概念,來更加深入。這種由外部負責其依賴需求的行為,我們可以稱其為控制反轉。工廠模式,依賴轉移當然,實現控制反轉的方法有幾種。 容器,字面上理解就是裝東西的東西。常見的變量、對象屬性等都可以算是容器。一個容器能夠裝什么,全部取決于你對該容器的定義。當然,有這樣一種容器,它存放的不是文本、數值,而是對象、對象的描...
簡介 1.學習本篇文章,了解簡單工廠設計模式的使用場景。2.如何使用簡單工廠模式。3.簡單工廠模式能解決什么問題? 場景 現在有一家外賣小店需要從生產一份外賣開始進行考慮設計,當客戶在網上點出不同味道的菜時,外賣小店就將按照不同的訂單進行生產出菜品,然后進行打包、等待外賣小哥獲取、贈送給客戶等不同的幾道工序,才算完成一單,但是后期由于生意很好,客戶評價很高,有些地方的老板想加盟本店了,那么可能就會...
摘要:工廠模式,依賴轉移當然,實現控制反轉的方法有幾種。其實我們稍微改造一下這個類,你就明白,工廠類的真正意義和價值了。雖然如此,工廠模式依舊十分優秀,并且適用于絕大多數情況。 此篇文章轉載自laravel-china,chongyi的文章https://laravel-china.org/top...原文地址: http://www.insp.top/learn-lar... ,轉載務必保...
摘要:我們今天也來做一個萬能遙控器設計模式適配器模式將一個類的接口轉換成客戶希望的另外一個接口。今天要介紹的仍然是創建型設計模式的一種建造者模式。設計模式的理論知識固然重要,但 計算機程序的思維邏輯 (54) - 剖析 Collections - 設計模式 上節我們提到,類 Collections 中大概有兩類功能,第一類是對容器接口對象進行操作,第二類是返回一個容器接口對象,上節我們介紹了...
閱讀 2619·2021-09-28 09:35
閱讀 3266·2021-09-03 10:28
閱讀 2917·2019-08-30 15:43
閱讀 1481·2019-08-30 14:04
閱讀 1813·2019-08-29 17:02
閱讀 1820·2019-08-26 13:59
閱讀 700·2019-08-26 11:51
閱讀 3262·2019-08-23 17:16