//---------------------------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. SQLServer中DataLength()和Len()两内置函数的区别(转载)

    最近工作中遇到了个问题:在数据库中声明字段类型时char(4),但实际只存储了‘DCE’三个字母,程序中拼装以该字段作为key的Map中,会把‘DCE’+空格作为其Key,这样造成用没加空格的‘DCE ...

  2. 移除jboss响应中的中间件信息

    JBoss 4.2 Suppressing the X-Powered-By header in JBoss 4.2.x can be done by modifying the web.xml fi ...

  3. linux date 简单介绍

    用法:date [选项]... [+格式] 或:date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]] 以给定的格式显示当前时间,或是设置系统日期. - ...

  4. 不使用 vue-cli 与 vue 模版,使用 Vue2.x + webpack4.x 从零开始一步步搭建项目框架

    说明 这是我根据慕课网上的一个课程 Vue+Webpack打造todo应用 过程一步步搭下来的框架,去掉了业务相关的逻辑. 项目最终的效果包括了引入vue框架:使用CSS预处理器:使用babel:引用 ...

  5. 第 14 章 结构和其他数据形式(enum枚举)

    /*----------------------------- enum.c -- 使用枚举类型的值 -----------------------------*/ #include <stdi ...

  6. linux 删除指定日期之前的文件

    两种方法: 1. 在一个目录中保留最近三个月的文件,三个月前的文件自动删除. find /email/v2_bak -mtime +92 -type f -name *.mail[12] -exec ...

  7. node版本查看管理工具

    1.nvm : 有点坑爹,安装完后,发现node not found ,最后卸载了,重装node 2.bower :(前端)包管理器(选用) //安装方法 npm install bower -g / ...

  8. NOIP模拟赛-2018.11.6

    NOIP模拟赛 今天想着反正高一高二都要考试,那么干脆跟着高二考吧,因为高二的比赛更有技术含量(我自己带的键盘放在这里). 今天考了一套英文题?发现阅读理解还是有一些困难的. T1:有$n$个点,$m ...

  9. [游记] Noip 2018

    飞雪连天射白鹿, 笑书神侠倚碧鸳 $ 2018/12/14 $ 经历了 \(noip\) 玩完的心态爆炸之后,还是决定稍微写一下游记记录一下\(QAQ\),以免以后就忘了. 然后打算先写个框架之后再慢 ...

  10. OpenCV——LBP(Local Binary Patterns)特征检测

    #include <opencv2/opencv.hpp> #include <iostream> #include "math.h" using name ...