设计模式 笔记 单例模式 Singleton
//---------------------------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的更多相关文章
- 设计模式之单例模式——Singleton
设计模式之单例模式--Singleton 设计意图: 保证类仅有一个实例,并且可以供应用程序全局使用.为了保证这一点,就需要这个类自己创建自己的对象,并且对外有 ...
- 设计模式(4) -- 单例模式(Singleton)
设计模式(4) -- 单例模式(Singleton) 试想一个读取配置文件的需求,创建完读取类后通过New一个类的实例来读取配置文件的内容,在系统运行期间,系统中会存在很多个该类的实例对象,也就是说 ...
- 乐在其中设计模式(C#) - 单例模式(Singleton Pattern)
原文:乐在其中设计模式(C#) - 单例模式(Singleton Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 单例模式(Singleton Pattern) 作者:weba ...
- 【设计模式】单例模式-Singleton
[设计模式]单例模式-SingletonEnsure a class has only one instance, and provide a global point to access of it ...
- 设计模式之——单例模式(Singleton)的常见应用场景
单例模式(Singleton)也叫单态模式,是设计模式中最为简单的一种模式,甚至有些模式大师都不称其为模式,称其为一种实现技巧,因为设计模式讲究对象之间的关系的抽象,而单例模式只有自己一个对象,也因此 ...
- 设计模式之单例模式(Singleton Pattern)
单例模式 单例模式(Singleton Pattern)在java中算是最常用的设计模式之一,主要用于控制控制类实例的数量,防止外部实例化或者修改.单例模式在某些场景下可以提高系统运行效率.实现中的主 ...
- 设计模式一: 单例模式(Singleton)
简介 单例模式是属于创建型模式的一种(另外两种分别是结构型模式,行为型模式).是设计模式中最为简单的一种. 英文单词Singleton的数学含义是"有且仅有一个元素的集合". 从实 ...
- 设计模式之——单例模式(Singleton)的常见应用场景(转):
单例模式(Singleton)也叫单态模式,是设计模式中最为简单的一种模式,甚至有些模式大师都不称其为模式,称其为一种实现技巧,因为设计模式讲究对象之间的关系的抽象,而单例模式只有自己一个对象,也因此 ...
- java设计模式之 单例模式 Singleton
static 的应用 单例模式 Singleton 单例:保证一个类在系统中最多只创建一个实例. 好处:由于过多创建对象实例,会产生过多的系统垃圾,需要GC频繁回收,由于GC会占用较大的系统资源,所有 ...
随机推荐
- Sql server bulk insert
Bulk Insert Sql server 的bulk insert语句可以高效的导入大数据量的平面文件(txt,csv文件)到数据库的一张表中,其用法如下: bulk insert test fr ...
- MyEclipse优化设置(最详细版本)
MyEclipse优化设置由于自己需要,在网上查了相关资料,现在总结如下: 本优化方法较全,希望能帮助到需要的人... 第一步: 取消自动validation validation有一堆,什么xml. ...
- RecyclerView使用技巧(item动画及嵌套高度适配解决方案)
原文地址 · Frank-Zhu http://frank-zhu.github.io/android/2015/02/26/android-recyclerview-part-3/?utm_sou ...
- Azure IoT 预配置解决方案
Azure IoT 预配置解决方案 Sangyu Li © 2018 一.什么是Azure IoT 预配置解决方案? 如图,这就是Azure IoT Suite中 Provision solutio ...
- sqlserver 镜像 断开连接 正在恢复+主机服务器关机用备用镜像
如果主机坏了断开连接就用备机的镜像数据库 --主备互换,备机sql命令 USE master; ALTER DATABASE test SET PARTNER FORCE_SERVICE_ALLO ...
- MySql详解(一)
MySql详解(一) 作为一名Java开发人员,数据库的地位不用多说了.从大学时期的SqlServer,到现在最流行的MySql和Oracle.前者随着阿里巴巴的去IOE化,在互联网公司中的使用比例是 ...
- python第四十四课——继承性之单继承
2.继承性 继承: 使用场景: 1).生活层面:... 2).计算机层面: 两部分组成,一部分我们称为父类(基类.超类.superclass),另一部分我们称为子类(派生类.subclass), 子类 ...
- 把php session 会话保存到redis
php的session会话默认时以文件形式保存在php.ini配置文件设置的会话缓存目录,文件保存会话的效率很低,每当每个用户登录一次就会在服务器上生成一个唯一的session_id文件,当用户登录量 ...
- Scala学习之路 (六)Scala的类、对象、继承、特质
一.类 1.类的定义 scala语言中没有static成员存在,但是scala允许以某种方式去使用static成员这个就是伴生机制,所谓伴生,就是在语言层面上,把static成员和非static成员用 ...
- memcached未授权
memcached未授权 漏洞成因: Memcached端口是对外开放的,用nc或Telne可以直接登录,查看信息,增加修改都可以. nc -vv 1.2.3.4 11211 telnet 1.2.3 ...