c++单例模式的写法

c++单例模式

class Singleton
{
    public:
        static GetInstance();
        ~Singleton();
    private:
        Singleton* p_singleton;
        Singleton();
}

实现

Singleton::Singleton() {
};
Singleton::~Singleton() {
    if(p_singleton) {
      delete p_singleton;
     }
}
Singleton* Singleton::GetInstance() {
    if(p_singleton == NULL) {
        p_singleton= new Singleton();
    }
}
Single::p_singleton =NULL;  //必要,类头文件中只是声明,并没有定义

当然,考虑到异常安全,可以加上锁。

Singleton::Singleton() {
};
Singleton::~Singleton() {
    if(p_singleton) {
      delete p_singleton;
     }
}
Singleton* Singleton::GetInstance() {
    Lock();
    if(p_singleton == NULL) {
        p_singleton= new Singleton();
    }
}
Single::p_singleton =NULL;  //必要,类头文件中只是声明,并没有定义

这样无论是不是第一个创建实例都要Lock,效率太低

Singleton::Singleton() {
};
Singleton::~Singleton() {
    if(p_singleton) {
      delete p_singleton;
     }
}
Singleton* Singleton::GetInstance() {
    if(p_singleton == NULL) {
        Lock();
        if(p_singleton == NULL) {
             p_singleton= new Singleton();
        }
    }
}
Single::p_singleton =NULL;  //必要,类头文件中只是声明,并没有定义

这样就好了。

但是这样存在另一个问题,这个实例如何delete;

可以在Singleton中自定义一个回收类,负责回收p_singleton

class Singleton
{
    public:
        static GetInstance();
        ~Singleton();
    private:
        class Garbo {
         public:
           ~Garbo() {
              if(p_singleton) {
                  delete p_singleton;
              }
           }
        }
        Garbo garbo;
        Singleton* p_singleton;
        Singleton();
}

程序结束会回收所有对象,包括gaobo,gaobo析构函数被调用,进而释放掉p_singleton;

单例模式还可以这么实现。

class Singleton {
public:
    static Singleton& GetInstance() ;
private:
    Singleton();
}
Singleton::Singleton() {
}
Singleton& GetInstance() {
   static Singleton MySingleton;
   return MySingleton;
}

当然,可以加锁。令人,编译器会自动添加copy构造函数和copy赋值函数,所以

Singleton singleton1= Singleton::GetInstance();

singleton不是GetInstance生成的sinleton,而是通过copy赋值函数构造出来的,这样就违反了单例的定义。

为了解决这个问题,可以声明Singleton的copy构造函数和copy赋值函数为私有变量,并且不去实现他们

class Singleton {
public:
    static Singleton& GetInstance() ;
private:
    Singleton(Singleton &rhs);
    Singleton& operator = (Singleton &rhs);
    Singleton();
}

这样就避免了赋值引起的问题

c++单例模式的写法

时间: 2024-10-02 22:15:12

c++单例模式的写法的相关文章

iOS开发笔记-两种单例模式的写法

iOS开发笔记-两种单例模式的写法 单例模式是开发中最常用的写法之一,iOS的单例模式有两种官方写法,如下: 不使用GCD #import "ServiceManager.h" static ServiceManager *defaultManager; @implementation ServiceManager +(ServiceManager *)defaultManager{ if(!defaultManager) defaultManager=[[self allocWith

设计模式:单例模式的写法(基础写法和线程安全写法)

单例模式的写法非常多.先给出一种最基础的写法: (A种写法): package singleton; public class SingletonInstance { private static SingletonInstance mSingletonInstance = null; // 特意将构造函数设置成 private,防止外部使用者new SingletonInstance(). private SingletonInstance() { } public static Single

两种单例模式的写法

iOS的单例模式有两种官方写法,如下: (1)不使用GCD #import "ServiceManager.h" static ServiceManager *defaultManager; @implementation ServiceManager +(ServiceManager *)defaultManager{ if(!defaultManager) defaultManager=[[self allocWithZone:NULL] init]; return default

Java单例模式的写法

写过很多单例模式实现,今天贴一个书中的写法. 单例模式定义:一种设计模式,在只需要为类创建一个实例的时候使用. 要求:只能有一种创建实例的方式,同时不能获得处于未初始化状态的对象引用. 因此在单例模式中,需要有一个声明为private的构造方法,而且只调用一次. package oop; /** * 单例模式 * * @author lunatictwo */ public class Singleton { private final static Singleton instance = n

几种单例模式的写法

方法一: public class Singleton1 {     private Singleton1(){         System.out.print("Singleton1 created");     }     private static Singleton1 instance = new Singleton1();     public static Singleton1 getInstance(){         return instance;     }

IOS单例模式推荐写法(转载)

1 +(instancetype)sharedUserLoginModel{ 2 3 static YLWUserLoginModel *instance; 4 5 static dispatch_once_t onceToken; 6 7 dispatch_once(&onceToken, ^{ 8 9 instance = [[YLWUserLoginModel alloc]init]; 10 11 }); 12 return instance; 13 14 } 这种写法的好处是: 1. 线

单例模式的写法和线程安全性的讨论

//饿汉模式:单例模式,就是无论用不用,什么时候用,在类加载的时候就实例化一个这个类的对象 //然后等到使用的时候,就是使用同一个实例对象 //好处:在多线程的环境下使用这种方法,可以避免多线程带来的冲突.与之相对应的是,懒汉模式(按需实例化) class Singleton1{ private Singleton1(){} private static Singleton1 s1 = new Singleton1(); public static Singleton1 getSingleton

java单例模式等一些程序的写法....持续更新...

一.单例模式的写法: public class MyFactory { /** * 饿汉式 */ private static MyFactory instance = new MyFactory(); private MyFactory(){ } public static MyFactory getInstance(){ return instance; } } public class MyFactory { /** * 懒汉式(要注意处理线程安全问题) */ private static

8种单例模式写法助你搞定面试

1. 单例模式常见问题 为什么要有单例模式 单例模式是一种设计模式,它限制了实例化一个对象的行为,始终至多只有一个实例.当只需要一个对象来协调整个系统的操作时,这种模式就非常有用.它描述了如何解决重复出现的设计问题, 比如我们项目中的配置工具类,日志工具类等等. 如何设计单例模式 ? 1.单例类如何控制其实例化 2.如何确保只有一个实例 通过一下措施解决这些问题: private构造函数,类的实例话不对外开放,由自己内部来完成这个操作,确保永远不会从类外部实例化类,避免外部随意new出来新的实例