//---------------------------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. 《SQLSERVER2012实施与管理实战指南》前4章节笔记内容

    <SQLSERVER2012实施与管理实战指南>前4章节笔记内容 <SQLSERVER2012实施与管理实战指南>的前面4章是<SQLSERVER企业级平台管理实践> ...

  2. Visual Basic 6.0(VB6.0)详细安装过程

    注:大家如果没有VB6.0的安装文件,可自行百度一下下载,一般文件大小在200M左右的均为完整版的软件,可以使用. 特别提示:安装此软件的时候最好退出360杀毒软件(包括360安全卫士,电脑管家等,如 ...

  3. NXlog配置

    NXlog文档: http://nxlog.org/docs/nxlog-ce/nxlog-reference-manual.html https://nxlog.org/documentation/ ...

  4. [Python_2] Python 基础

    0. 说明 Python 基础笔记,使用的版本为 Python 3.6.2 Python 的变量.字符串操作.list.元组.字典.循环.range.类型转换.运算等操作. 1. 引号的使用 字符串使 ...

  5. [Hive_2] Hive 的安装&配置

    0. 说明 在安装好 Hadoop 集群和 ZooKeeper 分布式的基础上装好 MySQL,再进行 Hive 安装配置 1. 安装 1.1 将 Hive 安装包通过 Xftp 发送到 /home/ ...

  6. Skype 服务器客户端策略参数优化

    1.skype通讯录原理 对于skype客户端的通讯录同步,首先说说原理,通讯簿信息是从AD同步的skype前端服务器(每天1:30),在从前端服务器同步的客户端(大概1小时内同步一次). skype ...

  7. SDN2017 第三次实验作业

    实验目的 在给定如上实验拓扑情况下,用vlan得到下列虚拟网段 h1--h4互通 h2--h5互通 h3--h6互通 其余主机间无法通信 实验步骤 1. 创建拓扑 #! /usr/bin/python ...

  8. Learn Algorithms With Javascript - 基于 Js 进行算法学习

    基于 javascript 学习并实现常用的经典算法,欢迎对算法和数学感兴趣的 Js 开发者参与,一起学习共同进步. 算法实现 排序 插入排序 sort/lib/insertion-sort.js 希 ...

  9. yaml格式

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

  10. Scala学习之路 (二)使用IDEA开发Scala

    目前Scala的开发工具主要有两种:Eclipse和IDEA,这两个开发工具都有相应的Scala插件,如果使用Eclipse,直接到Scala官网下载即可http://scala-ide.org/do ...