//---------------------------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. Jmeter之HTTP Cookie 管理器

    Jmeter所支持的Cookie标准有很多,同时jmeter也提供两组程序实现这些cookie标准,分别是httpclient3与httpclient4.http cookie 管理器中的Implem ...

  2. Spark 集群搭建

    0. 说明 Spark 集群搭建 [集群规划] 服务器主机名 ip 节点配置 s101 192.168.23.101 Master s102 192.168.23.102 Worker s103 19 ...

  3. saltstack二次开发(一)

    Saltstack简介 Salt是一个配置管理系统,能够维护预定义状态的远程节点(比如,确保指定的包被安装,指定的服务在运行),一个分布式远程执行系统,用来在远程节点(可以是单个节点,也可以是任意规则 ...

  4. linux sqlplus查询数据中文乱码解决方法记录

    locale-gen -lang en.US.UTF-8 重启.

  5. python第二十九课——文件读写(读取读取中文字符)

    演示:读取中文字符 结论: 1).如果不设置encoding,默认使用gbk进行编解码 2).如果编码和解码不一致,最终导致报错,但是一旦设置了errors='ingore',那么就不会报错,而采取乱 ...

  6. CHECKEDLISTBOX用法总结

    C# CHECKEDLISTBOX用法总结   一般认为:foreach (object obj in checkedListBox1.SelectedItems)即可遍历选中的值. 其实这里遍历的只 ...

  7. java中Integer与int装箱拆箱一点收获

    示例代码: class BoxIntInteger { public static void main(String[] args) { Integer a = new Integer(10111); ...

  8. 【转】Fiddler工作原理

    原文章链接:Web代码网chinabit.org Fiddler是一个http调试代理,它能 够记录所有的你电脑和互联网之间的http通讯,Fiddler 可以也可以让你检查所有的http通讯,设置断 ...

  9. linux(centos 7) 下安装nodejs

    1,到node官网下载linux版本,有32和64位版本 2,将文件上传到linux下 3,使用tar -xvf node-v8.9.3-linux-x64.tar.xz 进行解压 4,建立软连接,变 ...

  10. k8s 隔离context+namespace

    kubernetes 最简单的隔离是 应用间使用 namespace进行,对应不同项目,namespace 不同,那么相互调用使用 dns.namespace,而使用 context + namesp ...