摘要:時(shí)間年月日星期日說明本文部分內(nèi)容均來自慕課網(wǎng)。這對(duì)所有形態(tài)的工廠模式都是重要的這個(gè)系統(tǒng)的產(chǎn)品有至少一個(gè)的產(chǎn)品族同屬于一個(gè)產(chǎn)品族的產(chǎn)品是設(shè)計(jì)成在一起使用的。
時(shí)間:2017年08月27日星期日
說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com
教學(xué)源碼:https://github.com/zccodere/s...
學(xué)習(xí)源碼:https://github.com/zccodere/s...
什么是設(shè)計(jì)模式
設(shè)計(jì)模式(Design pattern)是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)
應(yīng)用設(shè)計(jì)模式的好處
設(shè)計(jì)模式是優(yōu)秀的使用案例 使用設(shè)計(jì)模式可提高代碼的重用性 讓代碼更容易被他人理解 保證代碼可靠性
重點(diǎn)內(nèi)容
工廠模式的概念 工廠模式的意圖 工廠模式的應(yīng)用場(chǎng)景 工廠模式的設(shè)計(jì)思想 工廠模式的好處
工廠模式概念
實(shí)例化對(duì)象,用工廠方法代替new操作 工廠模式包括工廠方法模式和抽象工廠模式 抽象工廠模式是工廠方法模式的擴(kuò)展
工廠模式的意圖
定義一個(gè)接口來創(chuàng)建對(duì)象,但是讓子類來決定哪些類需要被實(shí)例化 工廠方法把實(shí)例化的工作推遲到子類中去實(shí)現(xiàn)
什么情況下適合工廠模式
有一組類似的對(duì)象需要?jiǎng)?chuàng)建 在編碼時(shí)不能預(yù)見需要?jiǎng)?chuàng)建哪種類的實(shí)例 系統(tǒng)需要考慮擴(kuò)展性,不應(yīng)依賴于產(chǎn)品類實(shí)例如果被創(chuàng)建、組合和表達(dá)的細(xì)節(jié)
項(xiàng)目中的現(xiàn)狀
在軟件系統(tǒng)中經(jīng)常面臨著“對(duì)象”的創(chuàng)建工作,由于需求的變化,這個(gè)對(duì)象可能隨之也會(huì)發(fā)生變化,但它卻擁有比較穩(wěn)定的接口。為此,我們需要提供一種封裝機(jī)制來隔離出這個(gè)異變對(duì)象的變化,從而保持系統(tǒng)中其他依賴該對(duì)象的對(duì)象不隨著需求變化而變化。
基于項(xiàng)目現(xiàn)狀將代碼進(jìn)行如下設(shè)計(jì)
盡量松耦合,一個(gè)對(duì)象的依賴對(duì)象的變化與本身無關(guān) 具體產(chǎn)品與客戶端剝離,責(zé)任分割
工廠方法模式類圖
抽象工廠模式類圖
第二章:工廠模式應(yīng)用 2-1 工廠模式應(yīng)用代碼編寫
1.編寫HairInterface類
package com.myimooc.designpattern.c2factory.hair; /** * @describe 發(fā)型接口 * @author zc * @version 1.0 2017-08-27 */ public interface HairInterface { /** * 畫發(fā)型 */ void draw(); }
2.編寫LeftHair類
package com.myimooc.designpattern.c2factory.hair; /** * @describe 左偏分發(fā)型 * @author zc * @version 1.0 2017-08-27 */ public class LeftHair implements HairInterface { /** * 畫一個(gè)左偏分發(fā)型 */ @Override public void draw() { System.out.println("左偏分發(fā)型"); } }
3.編寫RightHair類
package com.myimooc.designpattern.c2factory.hair; /** * @describe 右偏分發(fā)型 * @author zc * @version 1.0 2017-08-27 */ public class RightHair implements HairInterface { /** * 畫一個(gè)右偏分發(fā)型 */ @Override public void draw() { System.out.println("右偏分發(fā)型"); } }
4.編寫InHair類
package com.myimooc.designpattern.c2factory.hair; /** * @describe 中偏分發(fā)型 * @author zc * @version 1.0 2017-08-27 */ public class InHair implements HairInterface{ @Override public void draw() { System.out.println("中偏分發(fā)型"); } }
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 發(fā)型工廠 * @author zc * @version 1.0 2017-08-27 */ public class HairFactory { /** * 根據(jù)類型來創(chuàng)建對(duì)象 * @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; } /** * 根據(jù)類的名稱來生產(chǎn)對(duì)象 * @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; } /** * 根據(jù)類的名稱來生產(chǎn)對(duì)象 * @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 模擬客戶端實(shí)現(xiàn) * @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.編寫B(tài)oy類
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 人物的實(shí)現(xiàn)接口 * @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 模擬客戶端實(shí)現(xiàn) * @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(); } }第四章:總結(jié) 4-1 總結(jié)
場(chǎng)景應(yīng)用
Spring BeanFactory
BeanFactory,作為Spring基礎(chǔ)的IOC容器,是Spring的一個(gè)Bean工廠 如果單從工廠模式的角度思考,它就是用來“產(chǎn)生Bean”,然后提供給客戶端
Bean的實(shí)例化過程如下
調(diào)用Bean的默認(rèn)構(gòu)造方法,或指定的構(gòu)造方法,生成bean實(shí)例(暫稱為instance1) 如果Bean的配置文件中注入了Bean屬性值,則在instance1基礎(chǔ)上進(jìn)行屬性注入形成instance2,這種注入是覆蓋性的 如果Bean實(shí)現(xiàn)了InitializingBean接口,則調(diào)用afterPropertiesSet()方法,來改變或操作instance2,得到instance3 如果Bean的配置文件中指定了init-method=”init”屬性,則會(huì)調(diào)用指定的初始化方法, 則在instance3的基礎(chǔ)上調(diào)用初始化方法init(),將對(duì)象最終初始化為instance4;當(dāng)然,這個(gè)初始化的名字是任意的
工廠方法模式和抽象工廠模式對(duì)比
工廠模式是一種極端情況下的抽象工廠模式,而抽象工廠模式可以看成是工廠模式的推廣 工廠模式用來創(chuàng)建一個(gè)產(chǎn)品的等級(jí)結(jié)構(gòu),而抽象工廠模式是用來創(chuàng)建多個(gè)產(chǎn)品的等級(jí)結(jié)構(gòu) 工廠模式只有一個(gè)抽象產(chǎn)品類,而抽象工廠模式有多個(gè)抽象產(chǎn)品類
工廠模式的實(shí)現(xiàn)幫助我們
系統(tǒng)可以在不修改具體工廠角色的情況下引進(jìn)新的產(chǎn)品 客戶端不必關(guān)系對(duì)象如何創(chuàng)建,明確了職責(zé) 更好的理解面向?qū)ο蟮脑瓌t,面向接口編程,而不要面向?qū)崿F(xiàn)編程
工廠模式適用于哪些場(chǎng)景
一個(gè)系統(tǒng)應(yīng)當(dāng)不依賴于產(chǎn)品類實(shí)例被創(chuàng)立、組成和表示的細(xì)節(jié)。這對(duì)所有形態(tài)的工廠模式都是重要的 這個(gè)系統(tǒng)的產(chǎn)品有至少一個(gè)的產(chǎn)品族 同屬于一個(gè)產(chǎn)品族的產(chǎn)品是設(shè)計(jì)成在一起使用的。這一約束必須得在系統(tǒng)的設(shè)計(jì)中體現(xiàn)出來 不同的產(chǎn)品以一系列的接口的面貌出現(xiàn),從而使系統(tǒng)不依賴于接口實(shí)現(xiàn)的細(xì)節(jié)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/70298.html
時(shí)間:2017年08月30日星期三說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)源碼:https://github.com/zccodere/s...學(xué)習(xí)源碼:https://github.com/zccodere/s... 第一章:責(zé)任鏈模式簡(jiǎn)介 1-1 課程簡(jiǎn)介 課程大綱 什么是責(zé)任鏈模式 如何實(shí)現(xiàn)責(zé)任鏈模式 責(zé)任鏈模式如何解耦 責(zé)任鏈模式的應(yīng)用 案例:...
時(shí)間:2017年08月27日星期日說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)源碼:https://github.com/zccodere/s...學(xué)習(xí)源碼:https://github.com/zccodere/s... 第一章:?jiǎn)卫J胶?jiǎn)介 1-1 簡(jiǎn)介 單例模式 概念及應(yīng)用場(chǎng)合 餓漢模式 懶漢模式 餓漢模式與懶漢模式的區(qū)別 什么是設(shè)計(jì)模式 是一套被反...
摘要:時(shí)間年月日星期二說明本文部分內(nèi)容均來自慕課網(wǎng)。慕課網(wǎng)教學(xué)源碼學(xué)習(xí)源碼第一章適配器模式的簡(jiǎn)介簡(jiǎn)介生活中的適配器翻譯軟件插座適配器適配器模式定義適配器模式講將一個(gè)類的接口,轉(zhuǎn)換成客戶期望的另外一個(gè)接口。 時(shí)間:2017年08月29日星期二說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)源碼:https://github.com/zccodere/s.....
摘要:時(shí)間年月日星期六說明本文部分內(nèi)容均來自慕課網(wǎng)。案例介紹飲料機(jī)配置模版把水煮沸泡飲料把飲料倒進(jìn)杯子加調(diào)味料第二章模版模式實(shí)現(xiàn)基本框架代碼編寫編寫類模版模式抽象基類,為所有子類提供一個(gè)算法框架。 時(shí)間:2017年09月02日星期六說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)源碼:https://github.com/zccodere/s...學(xué)習(xí)源...
時(shí)間:2017年08月31日星期四說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)源碼:https://github.com/zccodere/s...學(xué)習(xí)源碼:https://github.com/zccodere/s... 第一章:策略模式簡(jiǎn)介 1-1 簡(jiǎn)介 課程大綱 什么是策略模式 策略模式如何實(shí)現(xiàn) 策略模式總結(jié)篇 實(shí)例案例分享 日常生活中的策略 Wor...
閱讀 2795·2023-04-26 01:47
閱讀 3600·2023-04-25 23:45
閱讀 2481·2021-10-13 09:39
閱讀 616·2021-10-09 09:44
閱讀 1806·2021-09-22 15:59
閱讀 2785·2021-09-13 10:33
閱讀 1733·2021-09-03 10:30
閱讀 667·2019-08-30 15:53