zoukankan      html  css  js  c++  java
  • SINGLETON(单件)——对象创建型模式

    意图:主要是为了保证一个类仅有一个实例,并提供一个访问它的全局访问点。

    适用性:

    当一个类不知道它所必须创建的对象的类的时候。

    当一个类希望由它的子类来指定它所创建的对象的时候。

    结构图:

     

    实现:

    1)保证一个唯一的实例

    Singleton模式,用C++实现的一个很简单的例子。一台计算机运行中的操作系统理解为类COSSingleton的唯一实例,在系统启动时,只有一个操作系统被创建。做到这一点只需要在COSSingleton类中声明一个类操作(即一个静态成员函数),由它保证只有一个实例被创建。

    class COSSingleton
    {
    public:
        
    static COSSingleton* Instance();
        
    virtual void ShowOSVersion();
    protected:
        COSSingleton(
    void);
    private:
        
    static COSSingleton* _instance;
    };

    它包含了一个指向它的唯一实例的指针。注意构造函数的访问控制为protected,这是为了扩展性(子类继承),而又不打破Singleton模式的意图不能创建多个实例。 相应的实现如下:

    代码
    COSSingleton* COSSingleton::_instance = NULL;

    void COSSingleton::ShowOSVersion()
    {
        std::cout
    <<"Unknow";
    }

    COSSingleton
    * COSSingleton::Instance()
    {
        
    if (_instance==NULL)
        {
            _instance 
    = new COSSingleton();
        }
        
    return _instance;
    }

    2)创建Singleton类的子类

    现在让我们想象,在一个电脑上安装了多个系统,在启动时会提示选择,决定我们进入哪一个系统。事实上,问题就转换为我们要用Singleton的哪一个子类来实例化即将要启动的操作系统。通过参数化子类类型进行选择。重构Instance()函数,代码如下:

    代码
    static COSSingleton* Instance(int index);

    COSSingleton
    * COSSingleton::Instance(int index)
    {
        
    if (index == 0)
        {
            
    return new CWinOS();
        }
        
    else if(1 == index)
        {
            
    return new CLinuxOS();
        }
        
    else
        {
            
    if (_instance==NULL)
            {
                _instance 
    = new COSSingleton();
            }
            
    return _instance;
        }
    }

    这样一方面将对象创建延迟到子类进行,一方面保证唯一性。当然这样的实现会随着子类的增多而不堪重负,每次都要修改Instance()函数 。解决办法是使用注册表的方法。事先将子类信息储存或注册,在Instance函数中只进行查找并返回相应的子类实例对象。

  • 相关阅读:
    分别改动Cube每一个面的贴图UV(Unity3D开发之十八)
    解决MAC下PHP连接MYSQL错误Warning: mysql_connect(): No such file or directory in conn.php
    什么是IaaS,PaaS和SaaS及其区别
    /lib/dracut/hooks/shutdown/30-dm-shutdown.sh
    openstack instance bootmgr is missing 问题 修复
    openStack aio nova service-list neutron ext-list
    CentOS7 iso封装语句
    開始EEPlat之旅
    重构摘要4_构筑測试体系
    线程及其创建的方式
  • 原文地址:https://www.cnblogs.com/wxfasdic/p/1768709.html
Copyright © 2011-2022 走看看