设计模式(五)——单例模式
定义:保证一个类、只有一个实例存在,同时提供能对该实例加以访问的全局访问方法。
单例模式:如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; }