設計模式概述 - 工廠方法 & 原型 & 模板方法 & 外觀
工廠方法模式簡述
工廠方法模式(Factory Method Pattern)是一種創建型設計模式,它定義了一個用于創建對象的接口,但由子類決定實例化哪個類。工廠方法將類的實例化推遲到子類。
角色
- 產品接口(Product):定義產品的接口。
- 具體產品(ConcreteProduct):實現產品接口的具體類。
- 工廠接口(Creator):定義創建產品的工廠方法。
- 具體工廠(ConcreteCreator):實現工廠接口,返回具體產品的實例。
優點
- 解耦:客戶端不需要知道具體產品的類,只需依賴于產品接口。
- 擴展性:增加新產品時只需新增具體產品和具體工廠,而不需要修改已有代碼。
缺點
- 類的數量增加:每增加一種產品,就需要增加一個具體產品和一個具體工廠,可能導致類的數量增加。
- 復雜性:對于簡單的場景,使用工廠方法模式可能顯得過于復雜。
示例代碼
// 產品接口
interface Product {void use();
}// 具體產品A
class ConcreteProductA implements Product {@Overridepublic void use() {System.out.println("Using ConcreteProductA.");}
}// 具體產品B
class ConcreteProductB implements Product {@Overridepublic void use() {System.out.println("Using ConcreteProductB.");}
}// 工廠接口
abstract class Creator {public abstract Product factoryMethod();
}// 具體工廠A
class ConcreteCreatorA extends Creator {@Overridepublic Product factoryMethod() {return new ConcreteProductA();}
}// 具體工廠B
class ConcreteCreatorB extends Creator {@Overridepublic Product factoryMethod() {return new ConcreteProductB();}
}// 客戶端代碼
public class Client {public static void main(String[] args) {Creator creatorA = new ConcreteCreatorA();Product productA = creatorA.factoryMethod();productA.use();Creator creatorB = new ConcreteCreatorB();Product productB = creatorB.factoryMethod();productB.use();}
}
原型模式簡述
原型模式(Prototype Pattern)是一種創建型設計模式,它通過復制現有的實例來創建新對象,而不是通過實例化一個新的對象。這種模式適用于創建相似對象的場景,尤其是在創建對象的成本較高時。
角色
- 原型接口(Prototype):定義克隆方法。
- 具體原型(ConcretePrototype):實現原型接口,提供具體的克隆方法。
- 客戶端(Client):使用原型對象來創建新的對象。
優點
- 性能提升:通過復制現有對象來創建新對象,避免了重復的初始化過程。
- 簡化創建過程:可以通過克隆現有對象來簡化對象的創建過程。
缺點
- 復雜性:實現克隆方法可能會增加代碼的復雜性,尤其是在對象包含復雜的成員時。
- 深拷貝與淺拷貝:需要關注對象的拷貝方式,深拷貝和淺拷貝的選擇可能會影響對象的狀態。
示例代碼
// 原型接口
interface Prototype {Prototype clone();
}// 具體原型
class ConcretePrototype implements Prototype {private String name;public ConcretePrototype(String name) {this.name = name;}public String getName() {return name;}@Overridepublic Prototype clone() {return new ConcretePrototype(this.name);}
}// 客戶端代碼
public class Client {public static void main(String[] args) {ConcretePrototype original = new ConcretePrototype("Original");ConcretePrototype clone = (ConcretePrototype) original.clone();System.out.println("Original Name: " + original.getName());System.out.println("Cloned Name: " + clone.getName());}
}
模板方法模式簡述
模板方法模式(Template Method Pattern)是一種行為型設計模式,它定義了一個算法的骨架,并允許子類在不改變算法結構的情況下重新定義某些特定步驟。通過這種方式,模板方法模式可以實現代碼復用和算法的靈活性。
角色
- 抽象類(AbstractClass):定義模板方法和一些基本操作的接口。
- 具體類(ConcreteClass):實現抽象類中的某些操作,完成特定的算法步驟。
優點
- 代碼復用:通過將算法的公共部分放在抽象類中,減少了代碼重復。
- 靈活性:子類可以根據需要重寫某些步驟,靈活定制算法的具體實現。
缺點
- 增加復雜性:模板方法模式可能會導致類的數量增加,從而增加系統的復雜性。
- 限制擴展:子類只能重寫抽象類中定義的方法,可能會限制某些靈活性。
示例代碼
// 抽象類
abstract class AbstractClass {// 模板方法public final void templateMethod() {stepOne();stepTwo();stepThree();}// 基本方法protected abstract void stepOne();protected abstract void stepTwo();// 鉤子方法protected void stepThree() {System.out.println("Default Step Three Implementation.");}
}// 具體類A
class ConcreteClassA extends AbstractClass {@Overrideprotected void stepOne() {System.out.println("ConcreteClassA: Step One Implementation.");}@Overrideprotected void stepTwo() {System.out.println("ConcreteClassA: Step Two Implementation.");}
}// 具體類B
class ConcreteClassB extends AbstractClass {@Overrideprotected void stepOne() {System.out.println("ConcreteClassB: Step One Implementation.");}@Overrideprotected void stepTwo() {System.out.println("ConcreteClassB: Step Two Implementation.");}@Overrideprotected void stepThree() {System.out.println("ConcreteClassB: Custom Step Three Implementation.");}
}// 客戶端代碼
public class Client {public static void main(String[] args) {AbstractClass classA = new ConcreteClassA();classA.templateMethod();System.out.println();AbstractClass classB = new ConcreteClassB();classB.templateMethod();}
}
外觀模式簡述
外觀模式(Facade Pattern)是一種結構型設計模式,它為復雜的子系統提供一個統一的接口,使得子系統更易使用。通過外觀模式,客戶端可以通過一個簡單的接口與復雜的系統進行交互,從而降低系統的復雜性。
角色
- 外觀類(Facade):提供一個簡單的接口,封裝了復雜的子系統。
- 子系統類(Subsystem):實現具體的功能,通常由多個類組成。
優點
- 簡化接口:通過提供統一的接口,簡化了子系統的使用。
- 降低耦合:客戶端與子系統之間的依賴關系減少,提高了系統的可維護性。
- 提高可讀性:外觀模式使得代碼的結構更加清晰,易于理解。
缺點
- 可能導致功能膨脹:外觀類可能會變得過于復雜,承擔過多的責任。
- 不符合開放-封閉原則:如果子系統發生變化,可能需要修改外觀類的實現。
示例代碼
// 子系統類A
class SubsystemA {public void operationA() {System.out.println("SubsystemA: Operation A");}
}// 子系統類B
class SubsystemB {public void operationB() {System.out.println("SubsystemB: Operation B");}
}// 子系統類C
class SubsystemC {public void operationC() {System.out.println("SubsystemC: Operation C");}
}// 外觀類
class Facade {private SubsystemA subsystemA;private SubsystemB subsystemB;private SubsystemC subsystemC;public Facade() {subsystemA = new SubsystemA();subsystemB = new SubsystemB();subsystemC = new SubsystemC();}public void simpleOperation() {subsystemA.operationA();subsystemB.operationB();subsystemC.operationC();}
}// 客戶端代碼
public class Client {public static void main(String[] args) {Facade facade = new Facade();facade.simpleOperation();}
}