创建型模式
我们这里介绍四种对象创建型模式
ABSTRACT FACTORY 抽象工厂
FACTORY 工厂模式
PROTOTYPE 原型模式
SINGLETON 单例模式
抽象工厂模式
抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
UML图
例子:
|
|
测试结果
工厂模式
工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
C++中的工厂方法通常是虚函数并且常常是纯虚函数
UML图
例子:
|
|
测试结果:
原型模式
用原型实例指定对象的种类通过拷贝这些原型创建新的对象
UML图
普通方法的实现:
|
|
测试结果:
原型模式实现:
|
|
测试结果:
另一个例子:
|
|
测试结果:
单例模式
UML图
教科书实现
静态成员函数 instance()
静态的私有变量 pInstance
被保护的构造函数
|
|
懒汉模式(时间换空间)
使用类的私有静态指针变量指向类的唯一实例,并用一个公有的静态方法获取该实例
指向唯一实例的私有静态指针
获取这个唯一实例的公有函数,并且在需要时创建实例
构造函数私有,外界不可创建该类实例
相比于教科书上的实现,构造函数由保护变为私有,直接在类中实现获取实例的公有函数:
|
|
由于pInstance变量的释放问题,即实例的析构问题存在。虽然我们可以在程序结束的时候主动调用GetInstance()并且delete它返回的指针,
但是容易忘记并且操作繁琐。
所以我们在该类中定义一个静态全局变量,因为程序在结束时,系统会自动析构所有类的全局变量,也会析构所有类静态变量成员,
就好像他们也是全局变量一样。
所以我们定义一个这样的静态变量,加入一个只调用析构函数的class
|
|
饿汉模式(空间换时间)
如果你觉得上面的实现不够简洁的话,所以我们想到用局部静态方法来代替
把实例作为局部静态变量
一个考虑不周全的实现
|
|
之所以说上面的代码考虑不周全是因为,当我们调用静态方法get实例的时候,
如:
|
|
这种调用方式编译器会为类生成一个 默认复制构造函数,来支持类的拷贝。
这样的话就违背了单例的特性,所以我们改成
返回指针的形式:
|
|
或者我们重载 = 操作符,显式地声明类拷贝的复制构造函数
|
|