设计模式六:singleton单件模式——对象创建型模式

singleton单件模式——对象创建型模式


1.意图

保证一个类只有一个实例,并且提供一个全局的访问点

2.动机

让类自身负责保存他的唯一实例。这个类可以保证没有别的实例可以被创建,并且可以提供一个访问该实例的方法

3.适用性

当类智能有一个实例而且客户可以从一个众所周知的访问点访问它时

当这个唯一的实例应该是通过子类化可扩展时,并且客户应该无需修改代码就可以使用一个扩展的实例时。


4.结构


5.参与者

singleton

定义一个instance操作,允许客户访问它的唯一实例,instance是一个类操作

可能负责创建他自身的唯一实例


6.协作

客户只能通过instance访问类的唯一实例


7.效果

1)对唯一实例的受控访问

2)缩小命名空间,对全局变量的一种改进,避免那些存储唯一实例的全局变量污染命名空间

3)允许对操作和表示的精化,singleton可以有子类,并且用扩展类的实例来配置一个应用很容易

4)允许可变数目的实例,可以控制应用所使用的实例的数目。

5)比类操作更加灵活,另一种封装单件的方式是使用类操作,但是难以改变设计使类允许有多个实例。此外c++中的静态成员不是虚函数,不能多态的方式重定义。


8.实现

1)保证一个唯一的实例

将创建这个实例的操作隐藏在一个类操作后面,这个操作可以访问保存唯一实例的变量,并且他可以保证这个变量在返回值之前用这个唯一实例初始化。这种方式保证了单件在他的首次使用前被创建和使用。

构造器是protected的,试图直接实例化单件的客户都会得到报错的信息。

如果将单件定义成全局或者静态变量,然后依赖于自动的初始化是不够的,因为

a)我们不能保证静态对象只有一个实例会被声明

b)我们可能没有足够的信息静态实例化每一个单件

c)c++没有定义转换单元上全局对象的构造器的调用顺序

2)创建singleton的子类

最简单的方式是在singleton的instance操作中决定你想使用的是哪一个单件

另一个选择是讲instance的实现从父类中分离出来并将它放入子类,这就允许c++程序员在连接时刻决定单件的类。


9.代码示例

#include<iostream>
#include<string>
using namespace std;

class singleton
{
    private:
     static singleton *mySingleton;
     string name;
    protected:
    singleton()
    {
        name = "this is only object";
    }
    public:
    static singleton *getInstance()
    {
        if(mySingleton==0)
            return new singleton();
        return mySingleton;
    }
    static void release()
    {
        if(mySingleton!=0)
            delete mySingleton;
    }
    string getName()
    {
        return name;
    }
};

singleton *singleton::mySingleton=0;

int main()
{
    singleton *s= singleton::getInstance();
    cout<<s->getName()<<endl;

    singleton *ss= singleton::getInstance();
    cout<<ss->getName()<<endl;

    singleton *sss= singleton::getInstance();
    cout<<sss->getName()<<endl;
}

10.相关模式

很多模式都可以用singleton来实现,比如前面几种创建型模式

原文链接: https://www.cnblogs.com/w0w0/archive/2012/05/18/2508402.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/50542

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 上午2:11
下一篇 2023年2月9日 上午2:11

相关推荐