Singleton是设计模式中比较简单的一个。园中的朋友们应该都很熟悉了。前段时间参加xxx外企的面试,和面试官讨论C++的时候正好写了一个。当时由于在有些地方考虑不太周全,代码出现了一些疏漏。不过最终写出了合格的实现。
Singleton模式
要求:
1、保证类只有一个实例
2、实例只能由类自身构造
3、必须为其他所有对象提供这一对象以访问。
由此,我们画出Singleton模式的结构图如下:
根据要求,类实例只能由自身构造,因此必须要控制构造函数(默认构造函数和拷贝构造函数)的访问权限(这里不考虑继承的问题)。
class Singleton{ private: Singleton(); Singleton(Singleton &t); };
第一条,要求类只能有一个实例,因此必须防止客户出现拷贝或者复制的情况。
class Singleton{ private: Singleton(); Singleton(Singleton &t); Singleton& operator= (Singleton &rhs); };
最终实现如下:
class Singleton{ public: Singleton *Instance(); private: static Singleton *instance; Singleton(); Singleton(Singleton &t); Singleton& operator =(Singleton& rhs); }; Singleton* Singleton::instance = null; Singleton* Singleton::Instance{ if(instance == null){ instance = new Singleton(); } return instance; }
在上面的代码中,客户需要通过下面的方式取得单例对象
Singleton *ps = Singleton::Instance();
因为函数返回了一个对象的指针,如果客户失误调用delete操作符,则很容易出现错误甚至程序崩溃。因此可以修改Singleton::Instance()的实现:
class Singleton{ public: Singleton *Instance(); private: Singleton(); Singleton(Singleton &t); Singleton& operator =(Singleton& rhs); }; Singleton* Singleton::Instance{ static Singleton instance; return &instance; }
这样更加安全,也体现了延迟创建的原则。
多态的实现
比较简单而且好用的方法是使用模板。
template<class T> class Singleton{ public: T* Instance(){ static T t; return &t; } private: Singleton(); Singleton(Singleton&); Singleton& operator=(Singleton&); };
在定义C++类时,编译器会为我们自动创建一些函数(构造,析构,赋值操作符等),并且默认访问权限为public,如果不希望客户调用它,应该明确避免使用默认的实现,手动定义并限制其访问权限(Effective C++中的设计原则),在这个例子中得到了非常好的应用。
>>>>>>>>>>>>>>>>>>>>>>>>>>
2013-06-17 14:33:34