摘要:時間年月日星期日說明本文部分內容均來自慕課網。這對所有形態的工廠模式都是重要的這個系統的產品有至少一個的產品族同屬于一個產品族的產品是設計成在一起使用的。
時間:2017年08月27日星期日
說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com
教學源碼:https://github.com/zccodere/s...
學習源碼:https://github.com/zccodere/s...
什么是設計模式
設計模式(Design pattern)是一套被反復使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結
應用設計模式的好處
設計模式是優秀的使用案例 使用設計模式可提高代碼的重用性 讓代碼更容易被他人理解 保證代碼可靠性
重點內容
工廠模式的概念 工廠模式的意圖 工廠模式的應用場景 工廠模式的設計思想 工廠模式的好處
工廠模式概念
實例化對象,用工廠方法代替new操作 工廠模式包括工廠方法模式和抽象工廠模式 抽象工廠模式是工廠方法模式的擴展
工廠模式的意圖
定義一個接口來創建對象,但是讓子類來決定哪些類需要被實例化 工廠方法把實例化的工作推遲到子類中去實現
什么情況下適合工廠模式
有一組類似的對象需要創建 在編碼時不能預見需要創建哪種類的實例 系統需要考慮擴展性,不應依賴于產品類實例如果被創建、組合和表達的細節
項目中的現狀
在軟件系統中經常面臨著“對象”的創建工作,由于需求的變化,這個對象可能隨之也會發生變化,但它卻擁有比較穩定的接口。為此,我們需要提供一種封裝機制來隔離出這個異變對象的變化,從而保持系統中其他依賴該對象的對象不隨著需求變化而變化。
基于項目現狀將代碼進行如下設計
盡量松耦合,一個對象的依賴對象的變化與本身無關 具體產品與客戶端剝離,責任分割
工廠方法模式類圖
抽象工廠模式類圖
第二章:工廠模式應用 2-1 工廠模式應用代碼編寫
1.編寫HairInterface類
package com.myimooc.designpattern.c2factory.hair; /** * @describe 發型接口 * @author zc * @version 1.0 2017-08-27 */ public interface HairInterface { /** * 畫發型 */ void draw(); }
2.編寫LeftHair類
package com.myimooc.designpattern.c2factory.hair; /** * @describe 左偏分發型 * @author zc * @version 1.0 2017-08-27 */ public class LeftHair implements HairInterface { /** * 畫一個左偏分發型 */ @Override public void draw() { System.out.println("左偏分發型"); } }
3.編寫RightHair類
package com.myimooc.designpattern.c2factory.hair; /** * @describe 右偏分發型 * @author zc * @version 1.0 2017-08-27 */ public class RightHair implements HairInterface { /** * 畫一個右偏分發型 */ @Override public void draw() { System.out.println("右偏分發型"); } }
4.編寫InHair類
package com.myimooc.designpattern.c2factory.hair; /** * @describe 中偏分發型 * @author zc * @version 1.0 2017-08-27 */ public class InHair implements HairInterface{ @Override public void draw() { System.out.println("中偏分發型"); } }
5.編寫type.properties文件
left=com.myimooc.designpattern.c2factory.LeftHair right=com.myimooc.designpattern.c2factory.RightHair in=com.myimooc.designpattern.c2factory.InHair
6.編寫PropertiesReader類
package com.myimooc.designpattern.c2factory.hair; import java.io.InputStream; import java.util.Enumeration; import java.util.HashMap; import java.util.Map; import java.util.Properties; /** * @describe properties文件讀取類 * @author zc * @version 1.0 2017-08-27 */ public class PropertiesReader { public MapgetProperties(){ Properties props = new Properties(); Map map = new HashMap (); try{ InputStream in = getClass().getResourceAsStream("type.properties"); props.load(in); @SuppressWarnings("unchecked") Enumeration en = (Enumeration ) props.propertyNames(); while (en.hasMoreElements()) { String key = en.nextElement(); String property = props.getProperty(key); map.put(key, property); } in.close(); }catch (Exception e) { e.printStackTrace(); } return map; } }
7.編寫HairFactory類
package com.myimooc.designpattern.c2factory; import java.util.Map; import com.myimooc.designpattern.c2factory.hair.HairInterface; import com.myimooc.designpattern.c2factory.hair.LeftHair; import com.myimooc.designpattern.c2factory.hair.PropertiesReader; import com.myimooc.designpattern.c2factory.hair.RightHair; /** * @describe 發型工廠 * @author zc * @version 1.0 2017-08-27 */ public class HairFactory { /** * 根據類型來創建對象 * @param key * @return */ public HairInterface getHair(String key){ if("left".equals(key)){ return new LeftHair(); } else if("right".equals(key)){ return new RightHair(); } return null; } /** * 根據類的名稱來生產對象 * @param className * @return */ public HairInterface getHairByClass(String className){ try { HairInterface hair = (HairInterface) Class.forName(className).newInstance(); return hair; } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } /** * 根據類的名稱來生產對象 * @param className * @return */ public HairInterface getHairByClassKey(String key){ try { Mapmap = new PropertiesReader().getProperties(); HairInterface hair = (HairInterface) Class.forName(map.get(key)).newInstance(); return hair; } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } }
8.編寫Test類
package com.myimooc.designpattern.c2factory; import com.myimooc.designpattern.c2factory.hair.HairInterface; /** * @describe 模擬客戶端實現 * @author zc * @version 1.0 2017-08-27 */ public class Test { public static void main(String[] args) { // HairInterface left = new LeftHair(); // left.draw(); // // HairInterface right = new RightHair(); // right.draw(); HairFactory factory = new HairFactory(); // HairInterface left = factory.getHair("left"); // left.draw(); HairInterface left = factory.getHairByClass("com.myimooc.designpattern.c2factory.LeftHair"); left.draw(); // HairInterface hair = factory.getHairByClassKey("in"); // hair.draw(); } }第三章:抽象工廠模式 3-1 抽象工廠模式
代碼編寫
1.編寫Boy類
package com.myimooc.designpattern.c2factory.boy; /** * @describe 男孩 * @author zc * @version 1.0 2017-08-27 */ public interface Boy { void drawMan(); }
2.編寫HnBoy類
package com.myimooc.designpattern.c2factory.boy; /** * @describe 新年系列的男孩 * @author zc * @version 1.0 2017-08-27 */ public class HnBoy implements Boy { @Override public void drawMan() { System.out.println("新年系列的男孩"); } }
3.編寫McBoy類
package com.myimooc.designpattern.c2factory.boy; /** * @describe 圣誕系列的男孩 * @author zc * @version 1.0 2017-08-27 */ public class McBoy implements Boy { @Override public void drawMan() { System.out.println("圣誕系列的男孩"); } }
4.編寫Girl類
package com.myimooc.designpattern.c2factory.girl; /** * @describe 女孩 * @author zc * @version 1.0 2017-08-27 */ public interface Girl { void drawWomen(); }
5.編寫HnGril類
package com.myimooc.designpattern.c2factory.girl; /** * @describe 新年系列的女孩 * @author zc * @version 1.0 2017-08-27 */ public class HnGril implements Girl { @Override public void drawWomen() { System.out.println("新年系列的女孩"); } }
6.編寫McGril類
package com.myimooc.designpattern.c2factory.girl; /** * @describe 圣誕系列的女孩 * @author zc * @version 1.0 2017-08-27 */ public class McGril implements Girl { @Override public void drawWomen() { System.out.println("圣誕系列的女孩"); } }
7.編寫PersonFactory類
package com.myimooc.designpattern.c2factory; import com.myimooc.designpattern.c2factory.boy.Boy; import com.myimooc.designpattern.c2factory.girl.Girl; /** * @describe 人物的實現接口 * @author zc * @version 1.0 2017-08-27 */ public interface PersonFactory { // 獲取男孩接口 Boy getBoy(); // 獲取女孩接口 Girl getGirl(); }
8.編寫HnFactory類
package com.myimooc.designpattern.c2factory; import com.myimooc.designpattern.c2factory.boy.Boy; import com.myimooc.designpattern.c2factory.boy.HnBoy; import com.myimooc.designpattern.c2factory.girl.Girl; import com.myimooc.designpattern.c2factory.girl.HnGril; /** * @describe 新年系列加工廠 * @author zc * @version 1.0 2017-08-27 */ public class HnFactory implements PersonFactory { @Override public Boy getBoy() { return new HnBoy(); } @Override public Girl getGirl() { return new HnGril(); } }
9.編寫McFactory類
package com.myimooc.designpattern.c2factory; import com.myimooc.designpattern.c2factory.boy.Boy; import com.myimooc.designpattern.c2factory.boy.McBoy; import com.myimooc.designpattern.c2factory.girl.Girl; import com.myimooc.designpattern.c2factory.girl.McGril; /** * @describe 圣誕系列加工廠 * @author zc * @version 1.0 2017-08-27 */ public class McFactory implements PersonFactory { @Override public Boy getBoy() { return new McBoy(); } @Override public Girl getGirl() { return new McGril(); } }
10.修改Test類
package com.myimooc.designpattern.c2factory; import com.myimooc.designpattern.c2factory.boy.Boy; import com.myimooc.designpattern.c2factory.girl.Girl; import com.myimooc.designpattern.c2factory.hair.HairInterface; /** * @describe 模擬客戶端實現 * @author zc * @version 1.0 2017-08-27 */ public class Test { public static void main(String[] args) { // HairInterface left = new LeftHair(); // left.draw(); // // HairInterface right = new RightHair(); // right.draw(); HairFactory factory = new HairFactory(); // HairInterface left = factory.getHair("left"); // left.draw(); HairInterface left = factory.getHairByClass("com.myimooc.designpattern.c2factory.LeftHair"); left.draw(); // HairInterface hair = factory.getHairByClassKey("in"); // hair.draw(); testPerson(); } public static void testPerson(){ PersonFactory factory = new McFactory(); Girl girl = factory.getGirl(); girl.drawWomen(); factory = new HnFactory(); Boy boy = factory.getBoy(); boy.drawMan(); } }第四章:總結 4-1 總結
場景應用
Spring BeanFactory
BeanFactory,作為Spring基礎的IOC容器,是Spring的一個Bean工廠 如果單從工廠模式的角度思考,它就是用來“產生Bean”,然后提供給客戶端
Bean的實例化過程如下
調用Bean的默認構造方法,或指定的構造方法,生成bean實例(暫稱為instance1) 如果Bean的配置文件中注入了Bean屬性值,則在instance1基礎上進行屬性注入形成instance2,這種注入是覆蓋性的 如果Bean實現了InitializingBean接口,則調用afterPropertiesSet()方法,來改變或操作instance2,得到instance3 如果Bean的配置文件中指定了init-method=”init”屬性,則會調用指定的初始化方法, 則在instance3的基礎上調用初始化方法init(),將對象最終初始化為instance4;當然,這個初始化的名字是任意的
工廠方法模式和抽象工廠模式對比
工廠模式是一種極端情況下的抽象工廠模式,而抽象工廠模式可以看成是工廠模式的推廣 工廠模式用來創建一個產品的等級結構,而抽象工廠模式是用來創建多個產品的等級結構 工廠模式只有一個抽象產品類,而抽象工廠模式有多個抽象產品類
工廠模式的實現幫助我們
系統可以在不修改具體工廠角色的情況下引進新的產品 客戶端不必關系對象如何創建,明確了職責 更好的理解面向對象的原則,面向接口編程,而不要面向實現編程
工廠模式適用于哪些場景
一個系統應當不依賴于產品類實例被創立、組成和表示的細節。這對所有形態的工廠模式都是重要的 這個系統的產品有至少一個的產品族 同屬于一個產品族的產品是設計成在一起使用的。這一約束必須得在系統的設計中體現出來 不同的產品以一系列的接口的面貌出現,從而使系統不依賴于接口實現的細節
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/70298.html
時間:2017年08月30日星期三說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com教學源碼:https://github.com/zccodere/s...學習源碼:https://github.com/zccodere/s... 第一章:責任鏈模式簡介 1-1 課程簡介 課程大綱 什么是責任鏈模式 如何實現責任鏈模式 責任鏈模式如何解耦 責任鏈模式的應用 案例:...
時間:2017年08月27日星期日說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com教學源碼:https://github.com/zccodere/s...學習源碼:https://github.com/zccodere/s... 第一章:單例模式簡介 1-1 簡介 單例模式 概念及應用場合 餓漢模式 懶漢模式 餓漢模式與懶漢模式的區別 什么是設計模式 是一套被反...
摘要:時間年月日星期二說明本文部分內容均來自慕課網。慕課網教學源碼學習源碼第一章適配器模式的簡介簡介生活中的適配器翻譯軟件插座適配器適配器模式定義適配器模式講將一個類的接口,轉換成客戶期望的另外一個接口。 時間:2017年08月29日星期二說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com教學源碼:https://github.com/zccodere/s.....
摘要:時間年月日星期六說明本文部分內容均來自慕課網。案例介紹飲料機配置模版把水煮沸泡飲料把飲料倒進杯子加調味料第二章模版模式實現基本框架代碼編寫編寫類模版模式抽象基類,為所有子類提供一個算法框架。 時間:2017年09月02日星期六說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com教學源碼:https://github.com/zccodere/s...學習源...
時間:2017年08月31日星期四說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com教學源碼:https://github.com/zccodere/s...學習源碼:https://github.com/zccodere/s... 第一章:策略模式簡介 1-1 簡介 課程大綱 什么是策略模式 策略模式如何實現 策略模式總結篇 實例案例分享 日常生活中的策略 Wor...
閱讀 2779·2023-04-26 01:47
閱讀 3591·2023-04-25 23:45
閱讀 2460·2021-10-13 09:39
閱讀 605·2021-10-09 09:44
閱讀 1788·2021-09-22 15:59
閱讀 2761·2021-09-13 10:33
閱讀 1706·2021-09-03 10:30
閱讀 655·2019-08-30 15:53