单例模式

来源:互联网 发布:网络小贷牌照试点省份 编辑:程序博客网 时间:2024/05/22 06:02

Singleton也许是“四人帮”给出的最简单的设计模式,它允许一个类有且仅有一个实例的方法。下面的程序显示在c++中如何实现一个单例模式:

      创建一个单例模式的关键是防止客户程序员获得任何控制其对象生存期的权利。为了做到这一点,声明所有的构造函数为私有,并且防止编译器隐式生成任何构造函数。注意,拷贝构造函数和赋值构造函数(这两个方法故意没有实现,因为它们根本就不会被调用)被声明为私有,以便防止任何这类复制的动作产生。

      还必须决定如何去创建这个对象。在这里,它是被静态创建的,但也可以等待,直到客户程序员提出要求再根据要求进行创建。这种方式称为惰性初始化(lazy initialization),这种做法,只在创建对象的代价不大,并且并不是需要他的情况下才有意义。

      如果返回的是一个指针而不是引用,用户可能会不小心删除此指针,因此上述实现被认为是最安全的(析构函数也可以声明为私有或者保护的,以便缓和此问题)。在任何情况下,对象应该私有保存。如果使用指针,可以使用一个对象来进行释放指针,该对象唯一的用途就是释放指针,且该对象内置在单例中,并设为static,这样在程序结束的时候会自动释放该对象,调用该对象的析构函数,可以在这个析构函数中做一些删除指针的事情。

      通过公有成员函数来提供对其对象的访问。在这里,instance()产生Singleton对象的引用。其余接口是常见的类接口。

      注意,这种方法并没有限制只创建一个对象。这种技术也支持创建有限个对象的对象池。然而这种情况下,可能遇到池中共享对象的问题。如果这是一个问题,可以采用创建一个对共享对象进出对象池登记的方法来解决。