创建型模式主要关注对象的创建过程,将对象的创建过程进行封装,使客户端可以直接得到对象,而不用去关心如何创建对象。
有五种创建型模式:
- 单例模式(Singleton): 用于得到某类型的唯一对象;
- 工厂方法模式(FactoryMethod) : 用于创建复杂对象;
- 抽象工厂模式(AbstractFactory) : 用于创建一组相关或相互依赖的复杂对象;
- 建造者模式(Builder): 用于创建模块化的更加复杂的对象;
- 原型模式(ProtoType): 用于得到一个对象的拷贝;
1. 单例模式(Singleton)
意图
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
优点
- 由于实例是在Instance 属性方法内部创建的,因此类可以使用附加功能(例如,对子类进行实例化),即使它可能引入不想要的依赖性。
- 直到对象要求产生一个实例才执行实例化;这种方法称为"惰性实例化"。惰性实例化避免了在应用程序启动时实例化不必要的 singleton。
2. 工厂方法模式(FactoryMethod)
意图
1)定义一个用于创建对象的接口,让子类决定实例化哪一个类;
2)使一个类的实例化延迟到其子类。
优点
实现了开闭原则,可以在不改变工厂的前提下增加新产品。
3. 抽象工厂模式(AbstractFactory)
意图
用于创建一组相关或相互依赖的复杂对象。
附注:简单工厂、工厂方法、抽象工厂比较
简单工厂,工厂方法,抽象工厂都属于设计模式中的创建型模式。其主要功能都是帮助我们把对象的实例化部分抽取了出来,优化了系统的架构,并且增强了系统的扩展性。
- 简单工厂:简单工厂模式的工厂类一般是使用静态方法,通过接收的参数的不同来返回不同的对象实例。不修改代码的话,是无法扩展的。
- 工厂方法:工厂方法是针对每一种产品提供一个工厂类。通过不同的工厂实例来创建不同的产品实例。在同一等级结构中,支持增加任意产品。
- 抽象工厂:抽象工厂是应对产品族概念的。比如说,每个汽车公司可能要同时生产轿车,货车,客车,那么每一个工厂都要有创建轿车,货车和客车的方法。应对产品族概念而生,增加新的产品线很容易,但是无法增加新的产品。
区别
- 简单工厂 : 用来生产同一等级结构中的任意产品。(对于增加新的产品,无能为力)
- 工厂模式 :用来生产同一等级结构中的固定产品。(支持增加任意产品)
- 抽象工厂:用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)
4. 建造者模式(Builder)
意图
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
优点
采用建造者模式可以轻松地改变产品的内部表示。建造者模式将构造代码和表示代码分开。构造过程可以更精细地控制,生成器模式强调的是产品的构造过程,产品各部分具有依赖关系非常重要。
附注:与抽象工厂模式的比较
生成器模式关注于将构造对象的过程和构造的各个部分分开,而抽象工厂关注于构建一个产品系列。实际上,最大的区别是生成器模式创建的产品不一定有共同的父类,只要有类似的构造过程即可。
5. 原型模式(ProtoType)
意图
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象,也即通过一个已存在对象来进行新对象的创建。
优点
引入Prototype模式后不再需要一个与具体产品等级结构平行的工厂方法类,减少了类的构造,同时客户程序可以在运行时刻建立和删除原型。