下面簡單介紹工廠模式,適配器模式和模板方法模式:java
一 工廠模式git
簡單列一下這個模式的家族:一、靜態工廠模式 二、簡單工廠模式 三、工廠方法模式 四、抽象工廠模式程序員
一、靜態工廠模式github
這個最多見了,項目中的輔助類,TextUtil.isEmpty等,類+靜態方法。算法
二、簡單工廠模式設計模式
下面開始談談賣肉夾饃,得有個店:RoujiaMoStoreide
package com.zhy.pattern.factory.a; public class RoujiaMoStore { /** * 根據傳入類型賣不一樣的肉夾饃 * * @param type * @return */ public RouJiaMo sellRouJiaMo(String type) { RouJiaMo rouJiaMo = null; if (type.equals("Suan")) { rouJiaMo = new SuanRouJiaMo(); } else if (type.equals("Tian")) { rouJiaMo = new TianRouJiaMo(); } else if (type.equals("La")) { rouJiaMo = new LaRouJiaMo(); } rouJiaMo.prepare(); rouJiaMo.fire(); rouJiaMo.pack(); return rouJiaMo; } }
而後你得有各類風味的饃饃:測試
package com.zhy.pattern.factory.a; public abstract class RouJiaMo { protected String name; /** * 準備工做 */ public void prepare() { System.out.println("揉麪-剁肉-完成準備工做"); } /** * 使用大家的專用袋-包裝 */ public void pack() { System.out.println("肉夾饃-專用袋-包裝"); } /** * 祕製設備-烘烤2分鐘 */ public void fire() { System.out.println("肉夾饃-專用設備-烘烤"); } }
package com.zhy.pattern.factory.a; import com.zhy.pattern.factory.a.RouJiaMo; /** * 辣味肉夾饃 * @author jing */ public class LaRouJiaMo extends RouJiaMo { public LaRouJiaMo() { this.name = "辣味肉夾饃"; } }
package com.zhy.pattern.factory.a; /** * 酸味肉夾饃 * * @author jing */ public class SuanRouJiaMo extends RouJiaMo { public SuanRouJiaMo() { this.name = "酸味肉夾饃"; } }
如今這樣的設計,雖然能夠支持你賣肉夾饃了,可是有點問題,生產饃的種類和你的RoujiaMoStore耦合度過高了,若是增長几種風味,刪除幾種風味,你得一直修改sellRouJiaMo中的方法,因此咱們須要作必定的修改,此時簡單工廠模式就能派上用場了。
咱們開始寫個簡單工廠,把產生饃的過程拿出來:this
package com.zhy.pattern.factory.a; public class SimpleRouJiaMoFactroy { public RouJiaMo createRouJiaMo(String type) { RouJiaMo rouJiaMo = null; if (type.equals("Suan")) { rouJiaMo = new SuanRouJiaMo(); } else if (type.equals("Tian")) { rouJiaMo = new TianRouJiaMo(); } else if (type.equals("La")) { rouJiaMo = new LaRouJiaMo(); } return rouJiaMo; } }
而後以組合的方式,讓Store來使用:spa
package com.zhy.pattern.factory.a; public class RoujiaMoStore { private SimpleRouJiaMoFactroy factroy; public RoujiaMoStore(SimpleRouJiaMoFactroy factroy) { this.factroy = factroy; } /** * 根據傳入類型賣不一樣的肉夾饃 * * @param type * @return */ public RouJiaMo sellRouJiaMo(String type) { RouJiaMo rouJiaMo = factroy.createRouJiaMo(type); rouJiaMo.prepare(); rouJiaMo.fire(); rouJiaMo.pack(); return rouJiaMo; } }
好了,如今你隨便添加什麼種類的饃,刪除什麼種類的饃就和Store無關了,就是麼~人家只負責賣饃麼~ 這就是簡單工廠模式,固然了,你們也都比較熟悉。
二 適配器模式 以手機充電器爲例
將一個類的接口轉換成客戶指望的另外一個接口,適配器讓本來接口不兼容的類能夠相互合做。這個定義還好,說適配器的功能就是把一個接口轉成另外一個接口。
代碼解釋哈,如題目,手機充電器通常都是5V左右吧,咱天朝的家用交流電壓220V,因此手機充電須要一個適配器(降壓器)
首先一部手機:Mobile.java
package com.zhy.pattern.adapter; public class Mobile { /** * 充電 * @param power */ public void inputPower(V5Power power) { int provideV5Power = power.provideV5Power(); System.out.println("手機(客戶端):我須要5V電壓充電,如今是-->" + provideV5Power + "V"); } }
能夠看出,手機依賴一個提供5V電壓的接口:
package com.zhy.pattern.adapter; /** * 提供5V電壓的一個接口 * @author zhy * */ public interface V5Power { public int provideV5Power(); }
而後咱們擁有的是220V家用交流電:
package com.zhy.pattern.adapter; /** * 家用220V交流電 * @author zhy * */ public class V220Power { /** * 提供220V電壓 * @return */ public int provideV220Power() { System.out.println("我提供220V交流電壓。"); return 220 ; } }
下面咱們須要一個適配器,完成220V轉5V的做用:
package com.zhy.pattern.adapter; /** * 適配器,把220V電壓變成5V * @author zhy * */ public class V5PowerAdapter implements V5Power { /** * 組合的方式 */ private V220Power v220Power ; public V5PowerAdapter(V220Power v220Power) { this.v220Power = v220Power ; } @Override public int provideV5Power() { int power = v220Power.provideV220Power() ; //power通過各類操做-->5 System.out.println("適配器:我悄悄的適配了電壓。"); return 5 ; } }
最後測試,咱們給手機衝個電:
package com.zhy.pattern.adapter; public class Test { public static void main(String[] args) { Mobile mobile = new Mobile(); V5Power v5Power = new V5PowerAdapter(new V220Power()) ; mobile.inputPower(v5Power); } }
輸出:
現有類:我提供220V交流電壓。
適配器:我悄悄的適配了電壓。
手機(客戶端):我須要5V電壓充電,如今是-->5V
能夠看出,咱們使用一個適配器完成了把220V轉化了5V而後提供給手機使用,且咱們使用了組合(OO設計原則),原有的手機,以及200V電壓類都不須要變化,且手機(客戶端)和220V(被適配者)徹底解耦。
三 模版方法模式 展示程序員的一天
定義了一個算法的骨架,而將一些步驟延遲到子類中,模版方法使得子類能夠在不改變算法結構的狀況下,從新定義算法的步驟。
簡單看下定義,模版方法定義了一個算法的步驟,而且容許子類爲一個或多個步驟提供實現。定義還算清晰,下面來個例子展現下本公司的上班狀況(純屬娛樂,若有雷同,請對號入座)。簡單描述一下:本公司有程序猿、測試、HR、項目經理等人,下面使用模版方法模式,記錄下全部人員的上班狀況:
首先來個超類,超類中定義了一個workOneDay方法,設置爲做爲算法的骨架:
package com.zhy.pattern.template; public abstract class Worker { protected String name; public Worker(String name) { this.name = name; } /** * 記錄一天的工做 */ public final void workOneDay() { System.out.println("-----------------work start ---------------"); enterCompany(); computerOn(); work(); computerOff(); exitCompany(); System.out.println("-----------------work end ---------------"); } /** * 工做 */ public abstract void work(); /** * 關閉電腦 */ private void computerOff() { System.out.println(name + "關閉電腦"); } /** * 打開電腦 */ private void computerOn() { System.out.println(name + "打開電腦"); } /** * 進入公司 */ public void enterCompany() { System.out.println(name + "進入公司"); } /** * 離開公司 */ public void exitCompany() { System.out.println(name + "離開公司"); } }
定義了一個上班(算法)的骨架,包含如下步驟:
a、進入公司
b、打開電腦
c、上班狀況
d、關閉電腦
e、離開公司
能夠看到,a、b、d、e咱們在超類中已經實現,子類僅實現work這個抽象方法,記錄天天的上班狀況。下面各種人物入場:
程序猿:
package com.zhy.pattern.template; public class ITWorker extends Worker { public ITWorker(String name) { super(name); } @Override public void work() { System.out.println(name + "寫程序-測bug-fix bug"); } }
測試人員:
package com.zhy.pattern.template; public class QAWorker extends Worker { public QAWorker(String name) { super(name); } @Override public void work() { System.out.println(name + "寫測試用例-提交bug-寫測試用例"); } }
項目經理:
package com.zhy.pattern.template; public class ManagerWorker extends Worker { public ManagerWorker(String name) { super(name); } @Override public void work() { System.out.println(name + "打dota..."); } }
下面咱們測試下:
package com.zhy.pattern.template; public class Test { public static void main(String[] args) { Worker it1 = new ITWorker("鴻洋"); it1.workOneDay(); Worker pm = new ManagerWorker("坑貨"); pm.workOneDay(); } }
輸出結果:
-----------------work start --------------- 鴻洋進入公司 鴻洋打開電腦 鴻洋寫程序-測bug-fix bug 鴻洋關閉電腦 鴻洋離開公司 -----------------work end --------------- -----------------work start --------------- 坑貨進入公司 坑貨打開電腦 坑貨打dota... 坑貨關閉電腦 坑貨離開公司 -----------------work end ---------------
原文:https://blog.csdn.net/lmj623565791/article/details/24460585