问题描述
Singleton 模式解决问题十分常见, 我们怎样去创建一个唯一的变量( 对象)?在基于对象的设计中我们可以通过创建一个全局变量(对象) 来实现,在面向对象和面向过程结合的设计范式(如C++中)中,我们也还是可以通过一个全局变量实现这一点。但是当我们遇到了纯粹的面向对象范式中,这一点可能就只能是通过Singleton模式来实现了,可能这也正是很多公司在招聘 Java 开发人员时候经常考察Singleton 模式的缘故吧。
(全局变量在项目中是能不用就不用的,它是一个定时炸弹,是一个不安全隐患,特别是在多线程程序中,会有很多的不可预测性;同时,使用全局变量,也不符合面向对象的封装原则,所以,在纯面向对象的语言Java和C#中,就没有纯粹的全局变量。)
在GOF的《设计模式:可复用面向对象软件的基础》中是这样描述单例模式的:保证一个类只有一个实例,并提供一个访问它的全局访问点。首先,需要保证一个类只有一个实例;在类中,要构造一个实例,就必须调用类的构造函数,如此,为了防止在外部调用类的构造函数而构造实例,需要将构造函数的访问权限标记为protected或private;最后,需要提供要给全局访问点,就需要在类中定义一个static函数,返回在类内部唯一构造的实例。
代码实现
#include <iostream> #include <string> using namespace std; class Singleton { private: int i; static Singleton *instance; Singleton(int i) { this->i = i; } public: static Singleton *getInstance() { return instance; } void show() { cout << i << endl; } }; Singleton* Singleton::instance = new Singleton(8899); class A :public Singleton { }; int main() { Singleton *s = Singleton::getInstance(); Singleton *s2 = A::getInstance(); cout << (s == s2) << endl; return 0; }
运行结果:1
关于单例模式,推荐文章(个人觉得讲得是非常好的了):C++设计模式——单例模式