单键模式

.h文件:

#pragma once
/*****************************
* @filename:    Singleton.h
* @author:      kzf
* @version:     1.0
* @date:        2011/11/14
* @describe:    单键模式 保证唯一的实例
如果你整个程序是单线程的,那么标准模式或Meyers单例模式是你最佳选择
* @modification:无
*****************************/

//标准模式
class CSingleton1
{
private:
    //构造函数及析构函数私有化
    CSingleton1();
    virtual ~CSingleton1();

private:
    //防止拷贝构造 以及 赋值 操作
    CSingleton1(const CSingleton1 &ob);
    CSingleton1& operator=(const CSingleton1 &ob);
private:
    static CSingleton1* m_pInstance;

public:
    static CSingleton1* GetInstance();
    static void ReleaseInstance();
    void Print();
};

/**
标准模式的优缺点:
优点:
    属于“懒汉”单例模式,第一次调用GetInstance才分配内存,不调用则不分配内存
缺点:
    1)GetInstance中每次需要判断是否=NULL
    2)由于指针动态分配,必须手动调用ReleaseInstance释放
    3)多线程不安全,有可能实例化多个内存对象
**/

//Meyers单例模式
class CSingleton2
{
private:
    //构造函数及析构函数私有化
    CSingleton2();
    virtual ~CSingleton2();

private:
    //防止拷贝构造 以及 赋值 操作
    CSingleton2(const CSingleton2 &ob);
    CSingleton2& operator=(const CSingleton2 &ob);
private:
    int m_nTestNum;
public:
    static CSingleton2& GetInstance();
    void Print();
};
/**
Meyers单例模式的优缺点:
优点:
    1)属于“懒汉”单例模式,第一次调用GetInstance才实例化
    2)GetInstance中不需要判断是否=NULL,效率提高
    3)使用对象不是指针分配内存,不会内存泄漏
    4)多线程下能确保实例化一个内存对象
缺点:
    1)多线程下未真正意义上同步。
    这是因为C++中构造函数并不是线程安全的。
    C++中的构造函数简单来说分两步:
    第一步:内存分配
    第二步:初始化成员变量

    结论:Meyers方式虽然能确保在多线程中产生唯一的实例,但是不能确保成员变量的值是否正确.
**/

/**
从单例模式实现的角度考虑:
1、总是避免第三方调用拷贝构造函数以及赋值操作符
2、总是避免第三方调用构造函数
3、尽量避免第三方调用析构函数
4、总是需要一个静态方法用于全局访问

**/

.cpp文件:

#include "StdAfx.h"
#include "Singleton.h"

//----------------------标准模式----------------------------
CSingleton1* CSingleton1::m_pInstance = NULL;

CSingleton1::CSingleton1(void)
{
    printf("Construct begin\n");
    //假设各种变量的初始化操作,花费近1s时间 用Sleep进行模拟
    Sleep(1000);
    printf("Construct end\n");
}

CSingleton1::~CSingleton1(void)
{
    printf("Destruct\n");
}

CSingleton1::CSingleton1(const CSingleton1 &ob)
{
    //
}

CSingleton1& CSingleton1::operator =(const CSingleton1 &ob)
{
    if (&ob != this)
    {
    }
    return *this;
}

CSingleton1* CSingleton1::GetInstance()
{
    if (NULL == m_pInstance)
    {
        m_pInstance = new CSingleton1;
    }

    return m_pInstance;
}

void CSingleton1::ReleaseInstance()
{
    if (NULL != m_pInstance)
    {
        delete m_pInstance;
        m_pInstance = NULL;
    }
}

void CSingleton1::Print()
{
    printf("print out CSingleton1\n");
}

//----------------------Meyers单例模式----------------------------

CSingleton2::CSingleton2(void)
{
    m_nTestNum = 0;
    printf("Construct begin,testnum=%d\n", m_nTestNum);
    //假设各种变量的初始化操作,花费近1s时间 用Sleep进行模拟
    Sleep(1000); 

    m_nTestNum = 100;
    printf("Construct end,testnum=%d\n", m_nTestNum);
}

CSingleton2::~CSingleton2(void)
{
    printf("Destruct\n");
}

CSingleton2::CSingleton2(const CSingleton2 &ob)
{
    //
}

CSingleton2& CSingleton2::operator =(const CSingleton2 &ob)
{
    if (&ob != this)
    {
    }
    return *this;
}

CSingleton2& CSingleton2::GetInstance()
{
    //使用局部静态变量方式,从而使之延迟到调用时实例化
    static CSingleton2 gInstance;

    return gInstance;
}

void CSingleton2::Print()
{
    printf("print out CSingleton2 testnum=%d\n", m_nTestNum);
}
时间: 2024-10-05 16:37:34

单键模式的相关文章

设计模式-单键(Singleton)

[摘要]   在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性.以及良好的效率. 如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例? 这应该是类设计者的责任,而不是使用都的责任. [全文] 单键模式(Singleton) 动机 在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性.以及良好的效率. 如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例? 这应该是类设计者的责任,而不是使

使用单用户模式修改root密码

Linux系统的单用户模式类似于Windows系统的安全模式,允许用户进行一些操作,比如启动一些关键服务.在没有设置grub密码的前提下,我们可以使用单用户模式更改或重置root密码. 1.打开虚拟机 2.开机3秒内按任意键进入编辑菜单 3.编辑菜单中方向键"上"."下"用来选择条目,按"e"编辑命令:按"a"修改内核参数:按"c"进入命令行.这里我们按"e"进入编辑模式. 4.方向键&

linux基础:4、linux运行级别、单用户模式、救援模式

linux运行级别 含义:指的是Unix或Linux等类Unix操作系统下不同的运行模式.运行级别通常分为7等,分别是从0到6 ================================================================================== [[email protected] ~]# tail /etc/inittab # Default runlevel. The runlevels used are: #   0 - halt (Do N

单用户模式

inux的单用户模式类似windows的安全模式 可以做更改root密码(前提未设置grub密码)等操作 1.启动系统出现倒计时时,按任意键 2.按e键,在启动前编辑命令 3.选择第二行内核,按e键进入编辑状态 4.输入single或s或1,然后回车 5.按b键启动 到这已经进入了单用户模式,此时就可以更改系统的文件然后重启即可

linux的单用户模式与救援模式

[[email protected] ~]#reboot      //重启 按任意键进入 e进入编辑 a更改内核的一些参数 c进入命令行 此时需按e,选择第二项 按e进入如图: 在最后加上: 1(或s.S.single)   回车 按B键重启 runlevel查看当前运行级别S 为单用户模式 输入passwd即可更改root的密码,输入新密码后reboot重启后生效了 救援模式 reboot重启,按F2进入bios设置.用+.-将CD-ROM Drive移到最上面一项.按F10保存,并将关盘载

Solaris之单用户模式

1.TERM 表示终端 vt100 是简单的终端模式 Export TERM=vt100 在此模式下,方向键无效,用字母键 有很多环境变量,PATH .PS1 .TERM 一般在屏幕上写的都是暂时的,只有将其写入到 /etc/profile下面才永久有效.(export TERM=vt100) 2.进入单用户模式 .设置终端.文件位置改动到 /a 下面.修改完之后,重启即可. Vi /a/etc/passwd 首先需要设置vt100 终端模式. 单用户模式界面:方向键失效. 3.在此界面就可以直

运行级别,单用户模式,救援模式

运行级别 runlevel可以查看运行级别,cat /etc/inittab(有七个运行级别) init 6 = reboot = shutdown -r now init 0 = shutdown -h now 安装列表 yum grouplist LANG=en(系统内置的环境变量) #中文变成英文 安装图形界面 yum groupinstall -y "Desktop" yum groupinstall -y "X Window System" init 5

进入单用户模式

进入单用户模式:  按shift进入 1.开机到grub时,用上下键移到第二行的恢复模式,按e(注意不是回车) 即Ubuntu,With Linux 3.2.0-23-generic(recovery mode) 2.把ro recovery nomodeset 改成rw single init=/bin/bash   然后按ctrl+x 就可以进入 单用户模式. 重启系统后使用root进入单用户模式,运行 fsck.ext3 -y /dev/vda3 说明:ext3的文件系统使用fsck.ex

Linux系统如何进入单用户模式

进入单用户模式 第一步:开机,在如下界面按回车键. 第二步:在此界面按e键. 第三步,在此界面通过方向键上下选择第二个,如图所示:再按e 键. 第四步:光标处按一下空格键,再输入1或s,然后回车. 第五步:回退到此界面按b键,启动系统. 第六步:已进入系统.