关闭

[置顶] 设计模式学习--单例模式

标签: 设计模式应用实例
134人阅读 评论(0) 收藏 举报
分类:

单例模式,顾名思义就是在整个软件架构中或者说在整个应用中只存在该对象的一个实例。举个例子,比如在开源游戏引擎cocos里面有一个叫做Director的导演类,因为在整个游戏中只存在一个导演类,故该类就可以采用单例模式来实现。
先看一下单例模式的定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
通常情况下我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象,一个最好的解决方案是,让类自身负责保存它的唯一实例,这个类可以保证没有其他的实例可以被创建,并且可以提供一个访问该实例的方法。
在看一下单例模式的结构图:
单例模式结构图
适用性
1 当类只能有一个实例而且客户可以从一个大家都知道的访问点访问时
2 当这个唯一实例应该是通过子类化可以扩展时,并且客户应该无需更改代码就能用一个扩展的实例时
协作
客户只能通过Singleton的GetInstance操作获得一个Singleton的实例
优点
1 对唯一实例的受控访问
2 缩小名空间
3 允许对操作和表示的精化
4 允许可变数目的实例
5 比类操作更加灵活
实现
注意构造函数必须是保护性,任何外部想直接实例化该类的对象都会得到一个编译时错误。GetInstance使用惰性初始化,即静态成员初始化为0,如果该值为0则实例化一个对象,否则直接返回该变量。
例子

/************************************************************************
       @fileName:Emperor.h 
       @function: 单例模式的负责产生唯一实例
       @author: jaime
       @ver: 1.0.0
************************************************************************/
#pragma once
class Emperor
{
private:
    Emperor()
    {

    }
public:
    ~Emperor();
    static Emperor* getInstance();
    static void say();
private:
    static Emperor* instance;
};

#include "Emperor.h"
#include <iostream>

using namespace std;

Emperor* Emperor::instance = nullptr;

Emperor::~Emperor()
{
}

Emperor* Emperor::getInstance()
{
    if (instance == nullptr)
    {
        instance = new Emperor();
    }
    return instance;
}

void Emperor::say()
{
    cout << "我就是皇帝" << endl;
}


#include "stdafx.h"
#include "Emperor.h"

int _tmain(int argc, _TCHAR* argv[])
{
    int i = 0;
    for (i; i < 3; i++)
    {
        Emperor* emper = Emperor::getInstance();
        emper->say();
    }
    return 0;
}

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:37080次
    • 积分:765
    • 等级:
    • 排名:千里之外
    • 原创:42篇
    • 转载:0篇
    • 译文:4篇
    • 评论:13条
    最新评论