创建型模式
创建型设计模式抽象了实例化过程。它们帮助一个系统独立于如何创建、组合和表示它的那些对象。
- 类创建型模式使用继承改变被实例化的的类
- 对象创建型模式将实例化委托给另一个对象
Abstract Factory(抽象工厂)—— 对象创建型模式
意图
提供一个接口以创建一系列相关或相互依赖的对象,而无须指定它们具体的类。
适用性
以下情况使用 Abstract Factory 模式
- 一个系统要独立于它的产品的创建、组合和表示
- 一个系统要由多个产品系列中的一个来配置
- 要强调一系列相关的产品对象的设计以便行进联合使用
- 提供一个产品类库,但只想显示它们的接口而不是实现
效果
优点
- 他分离了具体的类
- 使得易于交换产品系列
- 有利于产品的一致性
缺点
- 难以支持新种类的产品
实现
/**
* 抽象工厂接口,返回了一组不同的抽象产品
*/
interface AbstractFactory {
createProductA(): AbstractProductA
createProductB(): AbstractProductB
}
/**
* 基础的抽象产品接口
*/
interface AbstractProductA {
useA(): string
}
/**
* 基础的抽象产品接口
*/
interface AbstractProductB {
useB(): string
}
/**
* 产品 A 实现
*/
class ConcreteProductA1 implements AbstractProductA {
useA() {
return 'A111'
}
}
/**
* 产品 B 实现
*/
class ConcreteProductB1 implements AbstractProductB {
useB() {
return 'B111'
}
}
/**
* 抽象工厂实现类
*/
class ConcreteFactory1 implements AbstractFactory {
public createProductA (): AbstractProductA {
return new ConcreteProductA1()
}
public createProductB (): AbstractProductB {
return new ConcreteProductB1()
}
}
function clientCode(factory: AbstractFactory) {
const productA = factory.createProductA();
const productB = factory.createProductB()
console.log(productA.useA());
console.log(productB.useB());
}
clientCode(new ConcreteFactory1())
已知应用
InterView 使用 Kit
后缀来表示 AbstractFactory
类。如 WidgetKit
DialogKit
。
Builder(生成器)—— 对象创建型模式
意图
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
适用性
- 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时
- 当构建过程必须允许被构造的对象有不同的表示时
相关模式
Abstract Factory 与 Builder 相似,也可以创建复杂对象。
Builder 模式着重于一步步构造复杂对象。最后一步返回产品。
Abstract Factory 着重于多个系列的产品对象。立即返回产品。
Factory Mathod(工厂方法)——对象创建型模式
意图
定义用一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使一个类的实例化延迟到其子类。
适用性
- 当一个类不知道它所必须创建的对象的类的时候
- 当一个类希望由它的子类来指定它所创建的对象的时候
- 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。
Prototype(原型)——对象创建型模式
意图
用原型实例制定创建对象的种类,并且通过拷贝这些原型创建新的对象。
适用性
- 当一个系统应该独立于它的产品创建、构成和表示时
- 当要实例化的类是在运行时指定时,例如,通过动态装载
- 为了避免创建一个与产品类层次平行的工厂层次时
- 当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用对应状态手动实例化更方便。
Singleton(单件/单例)——对象创建型模式
意图
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
适用性
- 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时
- 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无须更改代码就能使用一个扩展的实例时