设计模式学习--单例模式

原创 2015年07月07日 00:04:12

单例模式,顾名思义就是在整个软件架构中或者说在整个应用中只存在该对象的一个实例。举个例子,比如在开源游戏引擎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;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

设计模式入门学习 单例模式

很常用,也比较简单的模式。   单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。一般来说为保证这一点,要把构造函数变为私有或者受保护的。    class SingleTest ...

研磨设计模式之单例模式

  • 2012-03-02 10:34
  • 311KB
  • 下载

Java设计模式学习01——单例模式

转载自:http://blog.csdn.net/xu__cg/article/details/52902644 Java单例模式是一种常见且较为简单的设计模式。单例模式,顾名思义一个类仅能有一个实...

设计模式单例模式

java设计模式学习之单例模式

一、概述在实际开发中,有些对象我们只需要一个,比如:配置文件、工具类、线程池、缓存、日志对象等,如果创造出多个实例,就会导致许多问题,比如占用过多资源,不一致的结果等。 单例模式保证整个应用中某个实...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)