简介
什么是创建型模式
创建型模式,顾名思义,就是用来创建对象的模式。它抽象了实例化过程,帮助一个系统独立于如何创建、组合和表示它的对象。
分类
- 类创建型模式
- 使用继承改变被实例化的类。
- 类创建型模式有:工厂方法模式。
- 对象创建型模式
- 将实例化委托给另一个对象
- 对象创建型模式有:抽象工厂模式、建造者模式、原型模式。这三种模式都涉及到创建一个新的负责创建产品对象的“工厂对象”。抽象工厂模式由这个工厂对象产生多个类的对象。建造者模式由这个工厂对象使用复杂的协议逐步创建一个复杂的产品。原型模式由这个工厂对象通过拷贝原型对象来创建产品对象。
共同点
- 它们都将关于系统使用哪些具体的类的信息封装起来。
- 它们隐藏了这些类的实例是如何被创建的,整个系统关于这些对象知道的是有抽象类定义的接口。
创建型模式复习
名称 | 英文名 | 定义 | 类型 | 使用频率 |
---|---|---|---|---|
工厂方法模式 | Factory Method | 定义一个用于创建对象的接口,让子类决定实例化哪个类。工厂方法模式是一个类的实例化延迟到子类。 | 类创建型模式 | ★★★★★ |
抽象工厂模式 | Abstract Factory | 提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。 | 对象创建型模式 | ★★★★☆ |
单例模式 | Singleton | 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。 | 对象创建型模式 | ★★★☆☆ |
建造者模式 | Builder | 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 | 对象创建型模式 | ★★☆☆☆ |
原型模式 | Prototype | 用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。 | 对象创建型模式 | ★★☆☆☆ |
角色
- 产品接口。
- 产品实现。
- 工厂接口。
- 工厂实现。
UML类图
优点
- 封装。产品类的实例化有时候是比较复杂和多变的,通过工厂模式,将产品的实例化封装起来,调用者无需关心产品的实例化过程,只需依赖工厂即可得到自己想要的产品。
- 多态。基于工厂角色和产品角色的多态性设计是工厂方法模式的关键。它能够使工厂可以自主确定创建何种产品对象,而如何创建这个对象的细节则完全封装在具体工厂内部。工厂方法模式之所以又被称为多态工厂模式,是因为所有的具体工厂类都具有同一抽象父类。
- 符合“开闭原则”。在系统中加入新产品时,而只要添加一个具体工厂和具体产品就可以了,可扩展性大大提高,完全符合“开闭原则”。
缺点
- 增加了系统的复杂度。在添加新产品时,需要编写新的具体产品类,而且还要提供与之对应的具体工厂类,系统中类的个数将成对增加。
适用环境
- 将创建对象的任务委托给多个工厂子类中的某一个,客户端在使用时可以无须关心是哪一个工厂子类创建产品子类,需要时再动态指定,可将具体工厂类的类名存储在配置文件或数据库中。
如需详细了解请移步 设计模式(1)-工厂方法模式
角色
- 产品接口。
- 产品实现。
- 抽象工厂。
- 工厂实现。
UML类图
优点
- 符合“开闭原则”。增加新的具体工厂和产品族很方便,无须修改已有系统.
缺点
- 增加新的产品等级结构麻烦。
如需详细了解请移步 设计模式(2)-抽象工厂模式
如需详细了解请移步设计模式(3)-单例模式
角色
- Product:产品角色
- Builder:抽象建造者。
- ConcreteBuilder:具体建造者
- Director:指挥者
UML类图
优点
- 低耦合。在建造者模式中, 客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦。每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者, 用户使用不同的具体建造者即可得到不同的产品对象 。
- 符合“开闭原则”。指挥者类针对抽象建造者类编程,增加新的具体建造者无须修改原有类库的代码,系统扩展方便。
缺点
- 使用范围有限。如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。
适用环境
- 产品结构复杂,创建对象过程复杂
如需详细了解请移步 设计模式(4)-建造者模式
角色
- Prototype,抽象原型类
- ConcretePrototype,具体原型类
- Client,客户类
UML类图
优点
- 性能高。使用原型模式克隆对象比直接new一个对象性能高。
缺点
- 原型模式和单例模式是冲突的。
适用环境
- new一个对象时需要耗费很大的资源。
如需详细了解请移步 设计模式(5)-原型模式
总结
创建型模式紧密相关
有时创建型模式是竞争的。例如,有些情况下原型模式和抽象工厂模式都很合适。有时创建型模式是相互合作的,例如,建造者模式可以使用其他模式来实现某个构件的创建,原型模式可以在它的实现中使用Signleton。