设计模式(五)——单例模式

定义:保证一个类、只有一个实例存在,同时提供能对该实例加以访问的全局访问方法。

单例模式:如Windows的任务管理器

三个要点
   一是某个类只能有一个实例;
   二是它必须自行创建这个实例;
   三是它必须自行向整个系统提供这个实例

Singleton(单例):在单例类的内部实现只生成一个实例,同时它提供一个静态的getInstance()工厂方法,
             让客户可以访问它的唯一实例;为了防止在外部对其实例化,将其构造函数设计为私有;
             在单例类内部定义了一个Singleton类型的静态对象,作为外部共享的唯一实例

单例模式的使用步骤:
  a)  构造函数私有化。
  b)  提供一个全局的静态方法(全局访问点)来获取单例对象。
  c)  在类中定义一个静态指针,指向本类的变量的静态变量指针 。

优点:
(1) 单例模式提供了对唯一实例的受控访问。
(2) 节约系统资源。 由于在系统内存中只存在一个对象。
缺点:
(1) 扩展略难。 单例模式中没有抽象层。
(2) 单例类的职责过重。

 

适用场景
(1) 系统只需要一个实例对象,如系统要求提供一个唯一的序列号生成器
或资源管理器,或者需要考虑资源消耗太大而只允许创建一个对象。
(2) 客户调用类的单个实例只允许使用一个公共访问点,除了该公共访问
点,不能通过其他途径访问该实例。

 

#include <iostream>
using namespace std;

class Singleton
{
public:
    // 全局变量方法
    static Singleton * get_insatnce()
    {
        return instance;
    }
private:
    // 不让类的外部再创建实例 声明为private
    Singleton()
    {

    }
    static Singleton* instance;// 指向本例的唯一实例指针
};

// 饿汉式——在编译期间就已经确认了这个唯一的实例
Singleton* Singleton::instance = new Singleton; // 属于类的内部

class Singleton2
{
public:
    static Singleton2* get_instance()
    {
        if (instance == NULL) {
            instance = new Singleton2;
        }
        return instance;
    }
private:
    Singleton2() {

    }
    static Singleton2* instance;
};

// 懒汉式 遇到多线程的时候要注意加锁机制
Singleton2* Singleton2::instance = NULL;

int main()
{
    Singleton* s1 = Singleton::get_insatnce();

    system("pause");
    return 0;
}

 

posted @ 2019-02-09 15:43  狂奔~  阅读(196)  评论(0编辑  收藏  举报