读书人

singleton pattern-单件形式

发布时间: 2013-01-08 14:02:14 作者: rapoo

singleton pattern--单件模式

singleton pattern,又称单件模式,或者单例模式。singleton要求类有且仅有一个实例,并给其他对象提供这一实例。

singleton pattern-单件形式

控制类实例仅有一个,办法有两个:

1.私有化构造函数与copy构造函数,使用一个函数静态变量

  将对象的构造函数与copy构造函数声明为私有,那么只能通过类的成员函数或者是友元函数来调用构造函数,那么这里我们将只提供一个友元函数来调用该类的私有构造函数,那么如何确保实例化只有一个呢?干脆声明一个静态变量(静态变量这里就不详细深入了,如果有该静态变量,编译器是直接引用的,而不是重新构造一个新的静态变量赋值),而该静态变量获取通过友元函数。 注意这里是函数静态成员不是类的静态成员,类中的静态实际上总是被构造的,即使不使用该对象,但是在函数中的静态成员,如果没有调用该函数,就不会建立该对象,但是每次这个函数被调用时候都会检查是否需要建立对象)。我们应该尽量做到为不需要为我们不用东西付出。而且函数成员的静态变量初始化时间是我们能确定的(第一次调用该函数时候),但是类的成员静态变量是不能确定的。C++为一个object文件的源代码的集合内静态成员初始化提供某种保证,但是对于不同的源代码集合中静态成员初始化顺序没有这种保证,这些会给我们带来麻烦。例如一个需要初始化的静态变量是根据另外一个静态变量来的,但是有可能这个静态变量初始化顺序还在需要初始化的静态变量之后。  这里提醒一下如果看过C++你最好不要做的,你就可能会要说了,不是建议不要写成引用返回值吗?因为现在的情况已经很明确了,只会调用一次来创建People对象的实例。并会赋值到一个People对象。如果在多线程的环境下,该资源就是一个互斥资源,就需要注意使用“锁”来应对相应的问题。所以是可以在函数中建立静态变量。那么通过使用引用从而避免了临时对象的创建的性能消耗。(如果在GCC编译器中,编译器会在返回值创建临时变量这块会做相应的优化) 2.私有化copy构造函数,使用类的静态变量。

这里开放了一个方法来实例化该对象,我们在该方法中加入了逻辑判断,并在类中有一个静态变量来指示该类的实例化数量是多少?当该指示变量大于等于1的时候,我们就封锁该方法,禁止实例化更多的对象,小于的时候就进行实例化,并修改指示变量。所以这里完成了限制实例化个数为1的要求。(这里提示下,如果在多线程下面,指示变量是一个互斥资源)

扩展

现在假设我们规定,环境里只有一个男人和一个女人

singleton pattern-单件形式

这里说明一下为什么是私有继承,因为这里使用着是不需要关心这个Counted这个计数基类,所以这里采用私有继承是最好的方式。

singleton pattern-单件形式

读书人网 >软件架构设计

热点推荐