【設計模式】6-10:裝飾器模式、代理模式、工廠模式、原型模式、模板方法模式
阿新 • • 發佈:2022-01-11
第六章 裝飾器模式
類的行為或其演算法可以在執行時更改,屬於行為型模式
應用:不同實現類的功能不同,一個策略結構,一個上下文類(介面引數),n個介面實現類
public class StrategyPatternDemo { public static void main(String[] args) { Context context = new Context(new OperationAdd()); System.out.println("10 + 5 = " + context.executeStrategy(10, 5)); context= new Context(new OperationSubtract()); System.out.println("10 - 5 = " + context.executeStrategy(10, 5)); context = new Context(new OperationMultiply()); System.out.println("10 * 5 = " + context.executeStrategy(10, 5)); } }
第七章 代理模式
在訪問一個類時做一些控制,通過代理實現對類的訪問和控制
實現與被代理類方法的組合,為空時賦值再執行……
包含:介面、實現類、代理類,測試時父類引用(介面)指向子類物件
public class ProxyImage implements Image{ private RealImage realImage; private String fileName; public ProxyImage(String fileName){ this.fileName = fileName; } @Override public void display() { if(realImage == null){ realImage= new RealImage(fileName); } realImage.display(); } }
第八章 工廠模式
建立物件的介面,讓其子類自己決定例項化哪一個工廠類,工廠模式使其建立過程延遲到子類進行。
例項化工廠類,根據傳入的引數,生成對應實體類的物件
使用工廠類返回指定的子類
用途:日誌記錄、資料庫訪問
public class ShapeFactory { //使用 getShape 方法獲取形狀型別的物件 public Shape getShape(String shapeType){ if(shapeType == null){ return null; } if(shapeType.equalsIgnoreCase("CIRCLE")){ return new Circle(); } else if(shapeType.equalsIgnoreCase("RECTANGLE")){ return new Rectangle(); } else if(shapeType.equalsIgnoreCase("SQUARE")){ return new Square(); } return null; } }
呼叫
ShapeFactory shapeFactory = new ShapeFactory(); //獲取 Circle 的物件,並呼叫它的 draw 方法 Shape shape1 = shapeFactory.getShape("CIRCLE"); //呼叫 Circle 的 draw 方法 shape1.draw();
與簡單工廠模式的區別:簡單工廠模式是在測試類中進行選擇判斷,而工廠模式是編寫工廠類,在工廠類中返回指定的物件
第九章 原型模式
用於建立重複的物件,同時又能保證效能,屬於建立型模式
實現Cloneable介面,其clone方法用於建立當前物件的克隆
implements Cloneable public Object clone() { Object clone = null; try { clone = super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return clone; }
根據key字串的id,存入hashmap方法,從map中取值,返回對應物件的方法
第十章 模板方法模式
抽象類公開定義了執行它的方法的方式/模板。它的子類可以按需要重寫方法實現,但呼叫將以抽象類中定義的方式進行
場景:有多個子類公用的方法,且邏輯相同
注意:一般模板方法都加上 final 關鍵詞,以防止惡意操作
缺陷:多個子類均需要定義自己的子類實現,比較複雜
public abstract class Game { abstract void initialize(); abstract void startPlay(); abstract void endPlay(); //模板 public final void play(){ //初始化遊戲 initialize(); //開始遊戲 startPlay(); //結束遊戲 endPlay(); } }
本文來自部落格園,作者:哥們要飛,轉載請註明原文連結:https://www.cnblogs.com/liujinhui/p/15787150.html