创建型模式抽象了实例化过程,他们帮助一个系统独立于如何创建、组合和表示它的那些对象。一个类创建型模式使用继承改变被实例化的类,一个对象创建模式将实例化委托给另一个对象。
1. Factory Method
作用:
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到子类。
UML结构图:
抽象基类:
1)Product 创建出来的对象的抽象基类
2)Factory创建对象的工厂方法的抽象基类
接口函数:
1)Creator::FactoryMethod 纯虚函数,由派生类实现,创建出对应的Product
解析:
Factory子类和Product子类一一对应,在Factory类和Product类相互协作的时候是由相应的Factory派生类来生成Product的派生类,也即如果要新增一种Product,那么也要对应的新增一个Factory,创建的过程委托给了这个Factory。
2. Abstract Factory
作用:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
UML结构图:
抽象基类:
1)ProductA,ProductB 分别代表不同类型的产品,而他们的派生类则是这种产品的一个实现
2)AbstractFactory 生产这一系列产品的一个抽象工厂,它的派生类是不同的实现
接口函数:
1)AbstractFactory::CreateProductA 和 AbstractFactory::CreateProductB分别是生产不同产品的不同的实现, 由各个派生出来的抽象工厂实现之.
解析:
抽象工厂创建的是一系列相关的对象,其中创建的实现其实采用的就是Factory模式的方法,对于某个实现的有一个派生出来的工厂,另一个实现有另一个派生出来的工厂等等。
3. Builder模式
作用:
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
UML结构图:
适用情况:
1)当创建复杂对象的算法应该独立于该对象的组成部分以及他们的装配方式时
2)当构造过程必须允许被构造的对象有不同的表示时
抽象基类:
Builder 是全部创建对象过程的抽象,提供构建不同组成部分的接口函数
接口:
Builder::BuildPartA(), Builder::BuildPartB() 是对一个对象不同部分的构建函数接口,Builder的派生类来具体实现。这些BuildPart在Director::Construct()中被调用。
解析:
Builder模式基于这种情况,一个对象可能有多个不同的组成部分,这几个部分的不同的创建对象会有不同的表示,但是各个部分之间装配的方式是一致的。Director::Construct函数中固定了各个组成部分的装配方式,而具体装配是怎样的组成部分由Builder的派生类实现。
class Director { public: Director(Builder* pBuilder):m_pBuilder(pBuilder){} ~Director() { delete m_pBuilder; m_pBuilder = NULL; } // Construct函数表示一个对象的整个构建过程, 不同的部分之间的装配方式都是一致的, 首先构建PartA其次是PartB,只是根据不同的构建者会有不同的表示 void Construct() { m_pBuilder->BuilderPartA(); m_pBuilder->BuilderPartB(); } private: Builder* m_pBuilder; };
4. Prototype模式
作用:
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象
UML结构图:
抽象基类:
Portotype 虚拟基类,所有原型的基类,提供Clone接口函数。
接口函数:
Prototype::Clone函数,根据不同的派生类来实例化创建对象。
解析:
Prototype模式其实就是“虚拟构造函数”的一个实现,c++的实现机制中并没有支持这个特性,但是通过不同派生类实现的 Clone 接口函数可以完成与“虚拟构造函数”同样的效果。
实现:
//虚拟基类,所有原型的基类,提供 Clone 接口函数 class Prototype { public: Prototype(){} virtual ~Prototype(){} virtual Prototype* Clone()=0; }; //派生自Prototype,实现Clone方法 class ConcretePrototype1:public Prototype { public: ConcretePrototype1() { cout<<"ConcretePrototype1"<<endl;} ConcretePrototype1(const ConcretePrototype1& p) { cout<<"ConcretePrototype1 copy..."<<endl; } virtual ~ConcretePrototype1(){} virtual Prototype* Clone() { return new ConcretePrototype1(*this); } }; //派生自Prototype,实现Clone方法 class ConcretePrototype2:public Prototype { public: ConcretePrototype2() { cout<<"ConcretePrototype2"<<endl;} ConcretePrototype2(const ConcretePrototype2& p) { cout<<"ConcretePrototype2 copy..."<<endl; } virtual ~ConcretePrototype2(){} virtual Prototype* Clone() { return new ConcretePrototype2(*this); } }; int main() { Prototype* p1 = new ConcretePrototype1(); Prototype* p2 = p1->Clone(); Prototype* p3 = new ConcretePrototype2(); Prototype* p4 = p3->Clone(); delete p1; delete p2; delete p3; delete p4; return 0; }
5. Singleton模式
作用:
保证一个类仅有一个实例,并提供一个访问它的全局访问点
UML结构图:
实现:
一般的,如果一个项目中需要使用到 Singleton 模式比较多的话,那么一般会实现一个 Singleton 的模板类,模板类的模板参数是需要采用 Singleton 模式的类,比如这样实现:
Template<typename T> class Singleton { // . . .类的声明 }; //需要采用 singleton 模式的类 classTest:public Singleton<Test> { // …类的声明 };