java 工廠模式的實例詳解
java 工廠模式的實例詳解
工廠方法中的“工廠”和我們平常理解的一樣:用于生產(chǎn)產(chǎn)品。
而客戶是要和產(chǎn)品打交道,所以工廠方法模式的意義在于把客戶和產(chǎn)品分開,達(dá)到解耦和更靈活的目的。
一般我們有一個產(chǎn)品的抽象類,然后有幾個具體的產(chǎn)品,如下:
//抽象產(chǎn)品角色 public interface Product{ void product(); } //具體產(chǎn)品1 public class Pro1 implements Product{ @Override public void product() { System.out.println("產(chǎn)品1"); } } //具體產(chǎn)品2 public class Pro2 implements Product{ @Override public void product() { System.out.println("產(chǎn)品2"); } }
接著客戶要購買產(chǎn)品,他不直接和產(chǎn)品接觸,而是使用工廠,所以我們有一個工廠:
public class Factory { public static Product buy(type) { switch (type) { case 1: return new Pro1(); case 2: return new Pro2(); default: break; } return null; } }
客戶通過Factory .buy(type);即可購買到自己想要的產(chǎn)品。
————— 這就是 簡單工廠模式,又稱為 靜態(tài)工廠方法模式。
如果新增了一款產(chǎn)品,我們多寫一個產(chǎn)品類Pro3就可以了,但在工廠上我們要添加新的代碼才能生產(chǎn),這顯然不符合“開閉原則(對擴(kuò)展開放;對修改封閉)”,所以我們把工廠抽象,添加具體的工廠類,由客戶選擇某一個工廠,如下:
//抽象工廠 public interface Factory { Product buy(); } //具體工廠1 public class Factory1 implements Factory { @Override public Product buy() { return new Pro1(); } } //具體工廠2 public class Factory2 implements Factory { @Override public Product buy() { return new Pro2(); } }
當(dāng)新增了一款產(chǎn)品,我們多創(chuàng)建一個具體的工廠來生產(chǎn)就可以了。但是當(dāng)產(chǎn)品種類非常多時,會出現(xiàn)大量的與之對應(yīng)的工廠對象,這并不是我們所希望的。
——— 這就是 工廠方法模式
當(dāng)產(chǎn)品出現(xiàn)多個抽象時,我們可能會有多個產(chǎn)品接口,這個場景就成了我們所說的
——- 抽象工廠模式
總結(jié):
無論是簡單工廠模式,工廠方法模式,還是抽象工廠模式,他們都屬于工廠模式,在形式和特點(diǎn)上也是極為相似的,他們的最終目的都是為了解耦。在使用時,我們不必去在意這個模式到底工廠方法模式還是抽象工廠模式,因為他們之間的演變常常是令人琢磨不透的。經(jīng)常你會發(fā)現(xiàn),明明使用的工廠方法模式,當(dāng)新需求來臨,稍加修改,加入了一個新方法后,由于類中的產(chǎn)品構(gòu)成了不同等級結(jié)構(gòu)中的產(chǎn)品族,它就變成抽象工廠模式了;而對于抽象工廠模式,當(dāng)減少一個方法使的提供的產(chǎn)品不再構(gòu)成產(chǎn)品族之后,它就演變成了工廠方法模式。 所以,在使用工廠模式時,只需要關(guān)心降低耦合度的目的是否達(dá)到了。
以上就是java 工廠模式的實例詳解,如有疑問請留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
總結(jié)Java常用的時間相關(guān)轉(zhuǎn)化
今天給大家?guī)淼氖顷P(guān)于Java的相關(guān)知識,文章圍繞著Java常用的時間相關(guān)轉(zhuǎn)化展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06MyBatis加載映射文件和動態(tài)代理的實現(xiàn)
本文主要介紹了MyBatis加載映射文件和動態(tài)代理的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05java編程調(diào)用存儲過程中得到新增記錄id號的實現(xiàn)方法
這篇文章主要介紹了java編程調(diào)用存儲過程中得到新增記錄id號的實現(xiàn)方法,涉及Java數(shù)據(jù)庫操作中存儲過程的相關(guān)使用技巧,需要的朋友可以參考下2015-10-10Spring裝配Bean之用Java代碼安裝配置bean詳解
這篇文章主要給大家介紹了關(guān)于Spring裝配Bean之用Java代碼安裝配置bean的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用spring具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧。2017-10-10eclipse的web項目實現(xiàn)Javaweb購物車的方法
這篇文章主要介紹了eclipse的web項目實現(xiàn)Javaweb購物車的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10spring cloud oauth2 feign 遇到的坑及解決
這篇文章主要介紹了spring cloud oauth2 feign 遇到的坑及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03IDEA導(dǎo)入外部項目報Error:java: 無效的目標(biāo)發(fā)行版: 11的解決方法
這篇文章主要介紹了IDEA導(dǎo)入外部項目報Error:java: 無效的目標(biāo)發(fā)行版: 11,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-09