码迷,mamicode.com
首页 > 其他好文 > 详细

程序设计模式之单例模式

时间:2017-03-21 10:35:27      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:操作   访问   变量   return   方式   编译   程序   ++   分配   

一、单利模式:就是只有一个实例。
singleton pattern单例模式:确保某一个类在程序运行中只能生产一个实例,并提供一个访问它的全局访问点。这个类称为单例类。如一个工程中,数据库访问对象只有一个,电脑的鼠标只能连接一个,操作系统只能有一个窗口管理器,这是可以考虑使用单利模式。
众所周知,C++类中,类对象被创建时,编译系统为对象分配内存空间,并自动调用构造函数,由构造函数完成成员的初始话工作,也就是说使用构造函数来初始化对象。
1、那么我么需要把构造函数设置成私有的private,这样可以禁止别人使用构造函数创建其他的实例。
2、又单例类要一直向系统提供这个实例,那么,需要声明它为静态的实例成员,在需要的时候,才创建该实例。
3、且应该把这个静态成员设置为 null,在一个public 的方法里去判断,只有在静态实例成员为 null,也就是没有被初始化的时候,才去初始化它,且只被初始化一次。
二、代码示例
class Singleton(懒汉模式)
 {
  private:
  Singleton(){}
  static Singleton* singleton;
  public:
  static Singleton* getInstance(){
    if(singleton == NULL)
           singleton = new Singleton();
        return singleton;
 };
 Singleton* Singleton::singleton = NULL;
 class Singleton(饿汉模式)线程安全的,因为所有类共享一个静态变量的实例
  {
   private:
      Singleton(){}
      static Singleton* singleton;
   public:
      static Singleton* getInstance(){
    return singleton;
  };
Singleton* Singleton::singleton = new Singleton();
这是一个很棒的实现,简单易懂。但是这是一个完美的实现吗?不!该方法是线程不安全的。考虑两个线程同时首次调用instance方法且同时检测到p是NULL值,则两个线程会同时构造一个实例p,这是严重的错误!同时,这也是不是单例的唯一实现!
三、懒汉与饿汉
单例模式大约有两种实现方式:懒汉与饿汉
懒汉:顾名思义,不到万不得已就不会去实例化类,也就是说在第一次用到类实例的时候才回
去实例化,所以上面的经典方法被归为懒汉实现,以时间换空间。
饿汉:饿了肯定要饥不择食。所以单例类定义的时候就进行实例化,以空间换时间。
四、线程安全的懒汉实现
  加锁的经典懒汉实现:
class singleton
{
 private:
      singleton(){
    pthread_mutex_init(&mutex);
      }
  static singleton *p;
public:
  static pthread_mutex_t mutex;
  static singleton *initance();
}
singleton* singleton::p = NULL;
singleton* singleton::initance() { if (p == NULL) { pthread_mutex_lock(&mutex); if (p == NULL) p = new singleton(); pthread_mutex_unlock(&mutex); } return p; }
 
 
 
 
 
 
 
 
 
 
 
 
 

程序设计模式之单例模式

标签:操作   访问   变量   return   方式   编译   程序   ++   分配   

原文地址:http://www.cnblogs.com/mjbjtunlp/p/6592872.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!