<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
定義一個建立產品物件的工廠介面,將產品物件的實際建立工作推遲到具體子工廠類當中。這滿足建立型模式中所要求的「建立與使用相分離」的特點。
現實生活中,原始社會自給自足(沒有工廠),農耕社會小作坊(簡單工廠,民間酒坊),工業革命流水線(工廠方法,自產自銷),現代產業鏈代工廠(抽象工廠,富士康。我們可以看到工廠的變化趨勢,但是對於我們來說,看到是越簡單越好,也就是工廠更智慧化。
其實凡是需要生成複雜物件的地方,都可以嘗試考慮使用工廠模式來代替。
我們把被建立的物件稱為「產品」,把建立產品的物件稱為「工廠」。如果要建立的產品不多,只要一個工廠類就可以完成,這種模式叫「簡單工廠模式」。
簡單的說:
簡單工廠模式有一個具體的工廠類,可以生成多個不同的產品,屬於建立型設計模式
注意:
但是簡單工廠模式每增加一個產品就要增加一個具體產品類和一個對應的具體工廠類,這增加了系統的複雜度,違背了開閉原則。
簡單工廠模式的結構圖:
優點:
缺點:
可樂工廠:
現在我們有一個可樂工廠,可以生產可樂:可口可樂、百事可樂、無糖可樂(目前暫定三種)
先定義一個可樂介面:
/** * 我們有一個可樂工廠 */ public interface Cola { //生產可樂的方法 public void cola(); }
定義可口可樂的方法,實現可樂介面,重寫方法:
/** * 可口可樂 */ public class CocaCola implements Cola{ @Override public void cola() { System.out.println("開始生產可口可樂"); } }
定義百事可樂的方法,實現可樂介面,重寫方法:
/** * * 百事可樂 */ public class PepsiCola implements Cola{ @Override public void cola() { System.out.println("開始生產百事可樂"); } }
定義無糖可樂的方法,實現可樂介面,重寫方法:
/** * 五無糖可樂 */ public class SugarFreeCola implements Cola{ @Override public void cola() { System.out.println("開始生產無糖可樂"); } }
OK,接著我們先按照之前普通的方法實現功能,也就是在模擬使用者端(測試類)中建立物件,使用方法的方式來實現:
/** *普通實現方法 */ public class Test { public static void main(String[] args) { Cola c1 = new CocaCola(); Cola c2 = new PepsiCola(); Cola c3 = new SugarFreeCola(); c1.cola(); c2.cola(); c3.cola(); } }
輸出:
開始生產可口可樂
開始生產百事可樂
開始生產無糖可樂
這樣是沒有問題的。但是這個方法相當於在測試類中實現了物件並使用了方法,雖然很好的完成了任務,但是,我們的三個實現類和和介面緊密的繫結到了一起,這意味著我們的程式碼耦合出現嚴重問題,不利於以後的維護。
方案: 我們可以在使用者端和具體實現方法之間新增一個簡單工廠:
/** *可樂工廠 * 在這裡可以生產無糖可樂、百事可樂、可口可樂 */ public class ColaFactory { //給每個產品定一個編號 public static final int PepsiCola = 1; //百事 public static final int CocaCola = 2; //可口 public static final int SugarFreeCola = 3; //無糖 //通過編號來確定產品物件 public static Cola getCola(int num){ switch (num){ case 1: return new PepsiCola(); case 2: return new CocaCola(); case 3: return new SugarFreeCola(); default: return null; } } }
測試類:
public class Test2 { public static void main(String[] args) { //只要在這個方法捏傳入需要物件的引數,即可得到 Cola c = ColaFactory.getCola(3); //引數按需傳入 c.cola(); } }
當傳入3時:
開始生產無糖可樂
如果在後期需要新增產品,直接在工廠內新增選擇即可,通過方法和引數就可以獲取到
其他寫法:
我們可以不用預先設定產品的編號,也可以直接輸入產品名稱:
/** * 另一種工廠寫法 */ public class ColaFactoryTest { public static Cola getCola(String name){ if("無糖可樂".equals(name)){ return new SugarFreeCola(); }else if ("百事可樂".equals(name)){ return new PepsiCola(); }else if("可口可樂".equals(name)){ return new CocaCola(); }else { return null; } } }
測試類:
public class Test3 { public static void main(String[] args) { Cola c = ColaFactoryTest.getCola("百事可樂"); c.cola(); } }
輸出:
開始生產百事可樂
這樣也是沒問題的,大家可以喜歡用自己喜歡的方式即可。
簡單的工廠模式就是這樣,符合建立與使用相分離的特點,但是缺點也顯而易見,就是每次需要增加新產品的時候負責所有產品的建立,職責過重,一旦異常,整個系統將受影響。且工廠類程式碼會非常臃腫,違背高聚合原則,以及簡單工廠模式使用了 static 工廠方法,造成工廠角色無法形成基於繼承的等級結構等等。
到此這篇關於Java十分鐘精通進階簡單工廠模式的文章就介紹到這了,更多相關Java 簡單工廠模式內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45