C++两种单例(饿汉式,懒汉式)

  1. 俄汉式
#include <iostream>
using namespace std;

class A{
public:
    static A& getInstance(void){
        return s_instance;
    }
private:
    A(int data=0):m_data(data){}
    A(A const& that);
    int m_data;
    static A s_instance;
};
A A::s_instance(1234);
int main(void){
    A& a1 = A::getInstance();
    A& a2 = A::getInstance();
    cout << &a1 << ‘,‘ << &a2 << endl;
    return 0;
}

这个是以静态成员作为单例的。

因为是单例,所以禁止创建其他A类对象,A a调用构造函数创建对象,所以将A类的构造函数放在

private里,A a = A::getInstance()调用拷贝构造函数创建对象,所以将拷贝构造函数放在private里

面,同时接口函数static A& getInstance(void),是静态的,如果是非静态的,那么怎么调用getInstance

函数呢,所以必须是静态的.

注意:静态成员对象s_instance是可以调用私有的构造函数的(我也不知道为什么).

2.懒汉式

#include <iostream>
using namespace std;

class A{
public:
    static A& getInstance(void){
        if(!s_instance){
            s_instance  = new A(1234);
        }
        return *s_instance;
    }
    void release(void){
        if(s_counter && --s_counter==0){
            delete this;
            s_instance = NULL;
        }
    }
private:
    ~A(void){}
    A(int data = 0):m_data(data){}
    A(A const& that);
    int m_data;
    static int s_counter;
    static A* s_instance;
};
int A::s_counter = 0;
A* A::s_instance = NULL;
int main(void){
    A& a1 = A::getInstance();
    A& a2 = A::getInstance();
    cout << &a1 << ‘,‘ << &a1 << endl;
    a1.release();
    a2.release();
    return 0;
}

这里是以静态成员指针作为单例,也没什么好说的了.

注意:静态成员指针s_instance,在new A(1234)时调用构造函数,但是在delete this时,是不会调用析够函数的,不管是公有的析构函数还是私有的析构函数(为什么不能调用析构函数我也不知道)

时间: 2024-10-10 17:00:19

C++两种单例(饿汉式,懒汉式)的相关文章

单例饿汉式和饱汉式各自的有缺点(转)

单例模式应用于一个类只有一个实例的情况,并且为其实例提供一个全局的访问点. 特点: 1.一个类只有一个实例 2.自己创建这个实例 3.整个系统只能用这个实例 应用场景 外部资源:每台计算机有若干个打印机,但只能有一个PrinterSpooler,以避免两个打印作业同时输出到打印机. 内部资源:大多数软件都有一个(或多个)属性文件存放系统配置,这样的系统应该有一个对象管理这些属性文件. 实现方式 1.饿汉式:单例实例在类装载时就构建,急切初始化.(预先加载法) /** * 饿汉式(推荐) * */

黑马程序员-Java基础-面向对象-类和对象、封装、构造函数、this、static、饿汉式&amp;懒汉式

第一讲  面向对象概念 1.  定义 相对于与面向过程而言的,将功能封装进对象,我们只关心具备了该功能的对象,而不用关注对象的具体细节. 面向对象的特点:使复杂问题简单化.我们只关心什么对象能处理什么事情,而不用关心具体的实现细节. 2.  面向对象特征 封装.继承.多态. 第二讲  类和对象的关系 1.  概述 类就是:对现实生活中事物的描述,可以是实体的事物也可以是一件事等: 对象是:是某类事物的实例,实实在在存在的个体: 映射到java中,描述就是class定义的类. 具体对象就是对应ja

单例模式(饿汉式 懒汉式)

单例模式单例模式:创建一个需要使用的对象.这里先分析为什么要用类来创建,本来可以创建一个non-local静态对象.就是在main函数之前创建 T a();这个对象.但是非局部静态对象一般由“模版隐式具体化”形成,在多个编译单元内,它的初始化顺序未知(effective c++ 4th).所以用class方法的形式来构建一个单例模式. 首先单例模式分为饿汉式和懒汉式.饿汉:很饿,很着急,需要尽早的构建对象.对象式提前构建好的.懒汉:很懒,不着急,当对象需要用的时候,才构建对象. 1.饿汉式. 1

我喜欢的两种单例写法

1,第一种: 1 package ToolPackage 2 { 3 /** 4 * 提示 5 * @author tqr <br /> 6 * 创建时间:2014-11-7 下午6:27:10 7 */ 8 public class Tip 9 { 10 private static var instanceB:Boolean=true; 11 private static var instance:Tip; 12 13 public function Tip() 14 { 15 if (i

两种单例方式的对比

1.加互斥锁的单例(因为在多线程的情况下,不枷锁的情况线程是不安全的) + (instancetype)shaerdNetTool; // 实现 + (instancetype)shaerdNetTool{ static NetToll *tool = nil; @synchronized(self) { if (tool == nil) { tool = [NetToll new]; } } return tool; } 2.通过GCD的一次执行 (一次执行线程是安全的,整个运行过程只执行一次

Java-Singleton(单例创建-饿汉式,懒汉式)

package com.easygo.singleton; /** * Java单例有两种方式,饿汉式和懒汉式,饿汉式是在对象创建之前加载,优先于对象,而懒汉式是在对象创建完成后调用对象的方法来创建对象 * ,了解JVM加载原理的都清楚,正真意义上的单例是饿汉式,在对象创建之前加载. * @author lx * */ public class Singleton { //饿汉式 public static Singleton singleton=null; static { singleton

单例模式(懒汉式单例、饿汉式单例、登记式单例)

单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建.这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象. 注意: 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯一实例. 3.单例类必须给所有其他对象提供这一实例. 介绍 意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点.

单例设计模式(懒汉式,饿汉式)

设计模式:解决问题的一种行之有效的思想 单例设计模式:保证了一个类在内存中只能有一个对象,比如多程序访问一个配置文件,希望多程序操作都是同一个配置文件中的数据,那么就需要保证该配置文件对象的唯一性. 思路:1.怎么做才能保证这个对象是唯一的呢?其他程序通过new创建该类对象时根本无法控制个数,那么,就不让其他程序创建该类的对象了,因为不可以控制.2.不让其他程序创建,就该在本类中自己创建一个对象.3.该类将创建的对象对外提供,让其他程序获取并使用. 步骤:1.怎么实现不让其他程序创建该类对象呢?

单例模式:饿汉式与懒汉式

单例模式 唯一的实例 注意:私有化构造器.自行创建(含有一个该类的静态变量来保存唯一实例).必须自行向整个系统提供这个实例(对外提供获取该实例对象的方式:1.直接暴露2.静态变量的get方法获取) 几种常见形式 饿汉式:直接创建对象,不存在线程安全问题 直接实例化饿汉式简洁直观 枚举式 最简洁 静态代码块饿汉式 适合复杂实例化 饿汉式方式一: public class Singleton1 { public static final Singleton1 SINGLETON1 = new Sin