creation型design模式tutorial

Learning单例, 工厂, 建造者, 原型etc.creation型模式 implementation and application

查看tutoriallist

creation型design模式tutorial

creation型design模式关注object creation过程, providing了一种 in creationobject时隐藏creation逻辑 方式, 使得code更加flexible and 可maintenance. 本tutorial将详细介绍单例, 工厂, 建造者, 原型etc.common creation型design模式.

creation型design模式overview

creation型design模式 主要目 is 将object creation and using分离, from 而improvingcode flexible性 and 可maintenance性. throughusingcreation型模式, 我们可以:

  • 控制object creation过程
  • 隐藏objectcreation 细节
  • 使system独立于object creation, 组合 and 表示
  • providing一种统一 方式来creationobject

1. singleton pattern (Singleton)

concepts

singleton pattern确保一个class只 has 一个instance, 并providing一个全局访问点来访问这个instance.

implementation

// 懒汉式singleton pattern class Singleton { private static Singleton instance; private Singleton() { // 私 has constructmethod, 防止 out 部instance化 } public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } // 饿汉式singleton pattern class SingletonEager { private static final SingletonEager instance = new SingletonEager(); private SingletonEager() { // 私 has constructmethod } public static SingletonEager getInstance() { return instance; } } // 双重checklocksingleton pattern class SingletonDoubleCheck { private static volatile SingletonDoubleCheck instance; private SingletonDoubleCheck() { // 私 has constructmethod } public static SingletonDoubleCheck getInstance() { if (instance == null) { synchronized (SingletonDoubleCheck.class) { if (instance == null) { instance = new SingletonDoubleCheck(); } } } return instance; } }

application场景

  • log记录器
  • configurationmanagement器
  • datalibrary连接池
  • thread池
  • cache

2. factory pattern (Factory Method)

concepts

工厂method模式定义了一个creationobject interface, 但让子class决定要instance化 class is 哪一个. 工厂method让class instance化推迟 to 子classinfor.

implementation

// 产品interface interface Product { void use(); } // 具体产品A class ConcreteProductA implements Product { @Override public void use() { System.out.println("Using Product A"); } } // 具体产品B class ConcreteProductB implements Product { @Override public void use() { System.out.println("Using Product B"); } } // 工厂interface interface Factory { Product createProduct(); } // 具体工厂A class ConcreteFactoryA implements Factory { @Override public Product createProduct() { return new ConcreteProductA(); } } // 具体工厂B class ConcreteFactoryB implements Factory { @Override public Product createProduct() { return new ConcreteProductB(); } } // 客户端code class Client { public static void main(String[] args) { Factory factoryA = new ConcreteFactoryA(); Product productA = factoryA.createProduct(); productA.use(); Factory factoryB = new ConcreteFactoryB(); Product productB = factoryB.createProduct(); productB.use(); } }

application场景

  • 当一个class不知道它所必须creation object class时
  • 当一个class希望由它 子class来指定它所creation object时
  • 当class将creationobject 职责委托给 many 个helping子classin 某一个, 并且你希望将哪一个helping子class is proxy者这一information局部化时

3. Builder Pattern

concepts

Builder Pattern将一个 complex object 构建 and 它 表示分离, 使得同样 构建过程可以creation不同 表示.

implementation

// 产品class class Product { private String partA; private String partB; private String partC; public void setPartA(String partA) { this.partA = partA; } public void setPartB(String partB) { this.partB = partB; } public void setPartC(String partC) { this.partC = partC; } public void show() { System.out.println("Product parts: " + partA + ", " + partB + ", " + partC); } } // 建造者interface interface builder { void buildPartA(); void buildPartB(); void buildPartC(); Product getResult(); } // 具体建造者1 class Concretebuilder1 implements builder { private Product product; public Concretebuilder1() { product = new Product(); } @Override public void buildPartA() { product.setPartA("Part A1"); } @Override public void buildPartB() { product.setPartB("Part B1"); } @Override public void buildPartC() { product.setPartC("Part C1"); } @Override public Product getResult() { return product; } } // 具体建造者2 class Concretebuilder2 implements builder { private Product product; public Concretebuilder2() { product = new Product(); } @Override public void buildPartA() { product.setPartA("Part A2"); } @Override public void buildPartB() { product.setPartB("Part B2"); } @Override public void buildPartC() { product.setPartC("Part C2"); } @Override public Product getResult() { return product; } } // 指挥者 class Director { public void construct(builder builder) { builder.buildPartA(); builder.buildPartB(); builder.buildPartC(); } } // 客户端code class Client { public static void main(String[] args) { Director director = new Director(); builder builder1 = new Concretebuilder1(); director.construct(builder1); Product product1 = builder1.getResult(); product1.show(); builder builder2 = new Concretebuilder2(); director.construct(builder2); Product product2 = builder2.getResult(); product2.show(); } }

application场景

  • 当creation complex object algorithms应该独立于该object 组成部分以及它们 装配方式时
  • 当construct过程必须允许被construct object has 不同 表示时

4. Prototype Pattern

concepts

Prototype Pattern用原型instance指定creationobject 种class, 并且through拷贝这个原型来creation new object.

implementation

// 原型interface interface Prototype { Prototype clone(); } // 具体原型1 class ConcretePrototype1 implements Prototype { private String field; public ConcretePrototype1(String field) { this.field = field; } @Override public Prototype clone() { return new ConcretePrototype1(this.field); } public void setField(String field) { this.field = field; } public String getField() { return field; } @Override public String toString() { return "ConcretePrototype1{field='" + field + "'}"; } } // 具体原型2 class ConcretePrototype2 implements Prototype { private int field; public ConcretePrototype2(int field) { this.field = field; } @Override public Prototype clone() { return new ConcretePrototype2(this.field); } public void setField(int field) { this.field = field; } public int getField() { return field; } @Override public String toString() { return "ConcretePrototype2{field=" + field + "}"; } } // 客户端code class Client { public static void main(String[] args) { ConcretePrototype1 prototype1 = new ConcretePrototype1("Prototype 1"); ConcretePrototype1 clone1 = (ConcretePrototype1) prototype1.clone(); clone1.setField("Clone of Prototype 1"); System.out.println(prototype1); System.out.println(clone1); ConcretePrototype2 prototype2 = new ConcretePrototype2(100); ConcretePrototype2 clone2 = (ConcretePrototype2) prototype2.clone(); clone2.setField(200); System.out.println(prototype2); System.out.println(clone2); } }

application场景

  • 当一个system应该独立于它 产品creation, 构成 and 表示时
  • 当要instance化 class is in run时刻指定时
  • 当你希望throughcopy现 has object来creation new object, 而不 is throughinstance化 new object时

creation型模式 选择guide

in 选择creation型模式时, 可以考虑以 under 因素:

  • such as果需要确保一个class只 has 一个instance, usingsingleton pattern
  • such as果需要将object creation and using分离, usingfactory pattern
  • such as果需要构建 complex object, usingBuilder Pattern
  • such as果需要throughcopy现 has object来creation new object, usingPrototype Pattern

实践case: creation型模式 application

case: configurationmanagementsystem

fake设你需要design一个configurationmanagementsystem, 需要考虑以 under requirements:

  • system需要一个全局唯一 configurationmanagement器
  • 需要support不同class型 configuration (datalibraryconfiguration, applicationconfiguration, logconfigurationetc.)
  • configurationobject creation过程比较 complex , 需要 many 个步骤
  • 可能需要基于现 has configurationcreation new configuration

in 这个systemin, 你可以application以 under creation型模式:

  • singleton pattern: 用于configurationmanagement器, 确保全局只 has 一个instance
  • factory pattern: 用于creation不同class型 configurationobject
  • Builder Pattern: 用于构建 complex configurationobject
  • Prototype Pattern: 用于基于现 has configurationcreation new configuration

互动练习

练习1: singleton patternimplementation

请implementation一个threadsecurity singleton pattern, 并解释其implementation原理.

练习2: factory patternapplication

请design一个graph形工厂, able tocreation不同class型 graph形 (such as圆形, 矩形, 三角形) , 并usingfactory patternimplementation.

练习3: Builder Patternapplication

请usingBuilder Patterndesign一个计算机object 构建过程, 计算机package含CPU, memory, 硬盘etc.component.