//---------------------------15/04/09----------------------------

//Singleton 单例模式-----对象创建型模式

/*

1:意图:

保证一个类仅有一个实例,并提供一个访问它的全局访问点。

2:动机

3:适用性:

1>当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。

2>当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码

就能使用一个扩展的实例时。

4:结构:

Singleton:

static Instance()

{return uniqueInstance}

SingletonOperation()

GetSingletonData()

static uniqueInstance

singletonData

5:参与者:

Singleton:

1>定义一个Instance操作,允许客户访问它的唯一实例。Instance时一个类操作:

就是C++中的一个静态成员函数。

2>可能负责创建它自己的唯一实例。

6:协作:

客户只能通过Singleton的Instance操作访问一个Singleton实例。

7:效果:

1>对唯一实例的受控访问:

因为Singleton类封装它的唯一实例,所以它可以严格的控制客户怎样以及何时访问它。

2>缩小名空间:

Singleton模式是对全局变量的一种改进。它避免了那些存储唯一实例的全局变量污染名空间。

3>允许对操作和表示的精华:

Singleton类可以有子类,而且用这个扩展类的实例来配置一个应用是很容易的。

可以用需要的类的实例在运行时刻配置应用。<未知标记>

4>允许可变数目的实例:

通过改变允许访问Singleton实例的操作,来实现控制应用所使用的实例的数目。

5>比类操作更灵活:

另一种封装单件功能的方式是使用类操作:就是静态成员函数。

8:实现:

1>保证一个唯一的实例:

就是使用一个类操作来获得实例:                                     */

//这样实现是有线程安全问题的

class Singleton

{

public:

static Singleton* Instance();

protected:

Singleton();

private:

static Singleton* _instance;

};

Singleton* Singleton::_instance =;

Singleton* Singleton::Instance()

{

if(_instance ==
)

_instance =new Singleton;

return _instance;

}

//      2>创建Singleton类的子类:

//        使用单件注册表:

class Singleton

{

public:

static
void Register(constchar* name, Singleton*);

static Singleton* Instance();

protected:

static Singleton* Lookup(constchar* name);

private:

static Singleton* _instance;

static map<char*,Singleton*> _registry;//感觉map更好用

};

Singleton* Singleton::Instance()

{

if(_instance ==
)

{

const
char* singletonName = getenv("SINGLETON");

_instance = Lookup(singletonName);

}

return _instance;

}

//子类注册:在构造函数中注册自己

MySingleton::MySingleton()

{

Singleton::Register("MySingleton",this);

}

//这个构造函数只有被调用了,注册表中才有MySingleton,所以要在实现文件中定义一个静态实例

static MySingleton theSingleton;

//  9:代码示例:

class MazeFactory

{

public:

static MazeFactory* Instance();

static
void Register(constchar* name, MazeFactory*);

protected:

MazeFactory();

static MazeFactory* Lookup(constchar* name);

private:

static MazeFactory* _instance;

static map<char*,MazeFactory*> _registry;

};

MazeFactory* MazeFactory::_instance =;

MazeFactory* MazeFactory::Instance()

{

if(_instance =
)

{

const
char* mazeName = getenv("MAZESTYLE");

_instance = Lookup(mazeName);

}

return _instance;

}

void MazeFactory::Register(constchar* name, MazeFactory*  fac)

{

_registry.insert(std::make_pair(name,fac));

}

MazeFactory* MazeFactory::Lookup(constchar* name)

{

map<char*,MazeFactory*>::iterator it=_registry.find(name);

if(it != _registry.end())

return it->second;

return
;

}


设计模式 笔记 单例模式 Singleton的更多相关文章

  1. 设计模式之单例模式——Singleton

                        设计模式之单例模式--Singleton 设计意图: 保证类仅有一个实例,并且可以供应用程序全局使用.为了保证这一点,就需要这个类自己创建自己的对象,并且对外有 ...

  2. 设计模式(4) -- 单例模式(Singleton)

    设计模式(4)  -- 单例模式(Singleton) 试想一个读取配置文件的需求,创建完读取类后通过New一个类的实例来读取配置文件的内容,在系统运行期间,系统中会存在很多个该类的实例对象,也就是说 ...

  3. 乐在其中设计模式(C#) - 单例模式(Singleton Pattern)

    原文:乐在其中设计模式(C#) - 单例模式(Singleton Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 单例模式(Singleton Pattern) 作者:weba ...

  4. 【设计模式】单例模式-Singleton

    [设计模式]单例模式-SingletonEnsure a class has only one instance, and provide a global point to access of it ...

  5. 设计模式之——单例模式(Singleton)的常见应用场景

    单例模式(Singleton)也叫单态模式,是设计模式中最为简单的一种模式,甚至有些模式大师都不称其为模式,称其为一种实现技巧,因为设计模式讲究对象之间的关系的抽象,而单例模式只有自己一个对象,也因此 ...

  6. 设计模式之单例模式(Singleton Pattern)

    单例模式 单例模式(Singleton Pattern)在java中算是最常用的设计模式之一,主要用于控制控制类实例的数量,防止外部实例化或者修改.单例模式在某些场景下可以提高系统运行效率.实现中的主 ...

  7. 设计模式一: 单例模式(Singleton)

    简介 单例模式是属于创建型模式的一种(另外两种分别是结构型模式,行为型模式).是设计模式中最为简单的一种. 英文单词Singleton的数学含义是"有且仅有一个元素的集合". 从实 ...

  8. 设计模式之——单例模式(Singleton)的常见应用场景(转):

    单例模式(Singleton)也叫单态模式,是设计模式中最为简单的一种模式,甚至有些模式大师都不称其为模式,称其为一种实现技巧,因为设计模式讲究对象之间的关系的抽象,而单例模式只有自己一个对象,也因此 ...

  9. java设计模式之 单例模式 Singleton

    static 的应用 单例模式 Singleton 单例:保证一个类在系统中最多只创建一个实例. 好处:由于过多创建对象实例,会产生过多的系统垃圾,需要GC频繁回收,由于GC会占用较大的系统资源,所有 ...

随机推荐

  1. Saltstack安装配置过程

    一.安装配置 1.服务器配置情况 三台服务器,均需要关闭iptables和selinux(否则salt执行指令无效) master: 192.168.60.139 centos slave: 192. ...

  2. Oracle EBS AP取消核销

    --取消核销 created by jenrry 20170425 DECLARE l_result BOOLEAN; l_msg_count NUMBER; l_result_n varchar2( ...

  3. 使用TaskScheduler 调度器 实现跨线程的控件访问

    //任务调度器 TaskScheduler UIscheduler = null; public Form1() { //获取任务调度器 UIscheduler = TaskScheduler.Fro ...

  4. 类Unix上5个最佳开源备份工具 Bacula/Amanda/Backupninja/Backuppc/UrBackup

    当为一个企业选择备份工具的时候,你都考虑什么呢? 确定你正在部署的软件具有下面的特性 开源软件 – 你务必要选择那些源码可以免费获得,并且可以修改的软件.确信可以恢复你的数据,即使是软件供应商/项目停 ...

  5. fedora27安装后的配置工作(持续更新)

    换源 没什么可说的,安装后更换国内软件源是必须做的事,推荐更换阿里的镜像源.换源教程 添加epel源 EPEL (Extra Packages for Enterprise Linux)是基于Fedo ...

  6. MongoDB基础之 安装

    本篇来介绍MongoDB的安装.安装版本是3.4.18 如果安装老版本的mongodb,你会发现安装比较顺利,但是新版本的mongo安装稍微麻烦一点 ,主要是多了安全机制认证等步骤. 1.下载mong ...

  7. SDN期末

    一.项目描述 负载均衡程序 二.小组分工 组名:我们真的很弱 组员:李佳铭.吴森杰.张岚鑫.薛宇涛.杨凌澜 三.代码演示及过程描述 四.课程总结

  8. yaml格式

    yaml中允许表示三种格式,分别为常量值.对象和数组 例如: 其中#作为注释,yaml中只有行注释 基本格式要求: 1.大小写敏感:2.使用缩进代表层级关系: 3.缩进只能使用空格,不能使用tab键, ...

  9. C语言编程积累2

    版权声明:本文为CSDN博主(天才2012)原创文章,未经博主同意不得转载. https://blog.csdn.net/gzzaigcn/article/details/27113957 寥寥数笔, ...

  10. Android Studio快捷键——编辑篇

    Android Studio是官方推出的Android开发IDE,本系列讲解Android Studio中常用的快捷键,本文是该系列的第一篇,讲解的内容是与编辑代码相关的快捷键. 本文所讲快捷键基于A ...