设计模式与实例代码:单例模式
2012-03-23 21:35
351 查看
意图:为保证一个类仅有一个实例,并提供一个访问它的全局访问点,所有实体均使用此对象的相同的实例,而无需将引用传给它们。
问题:几个不同的客户对象需要引用同一对象,而且希望确保这种类型的对象数目不超过一个。、
解决方案:保证一个实例
参与者与协作者:客户对象只能通过getInstance接口创建单件实例
效果:客户对象无需要操心是否已存在单件实例,这是由单件类自己控制的
实现:添加一个类的私有的静态成员变量,引用所需要的对象。添加一人公共静态方法,当在成员为空是创建这个类实例,并返回类成员变量的值。将构造函数设为私有。
动机:让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建(通过截取创建新对象的请求),并且它可以提供一个访问该实例的方法。
单例是设计模式中比较简单的一个模式,其实现也比较简单,下面给出多线程安全的单例模式实现。
理解和扩展单例模式的核心是“如何控制用户使用new对一个类的实例构造器的任意调用”。例如将构造函数的调用转移到其他类中。
单件模式的使用并限于模仿实现上面的单件类,而是控制对类的构造函数的任意调用。
问题:几个不同的客户对象需要引用同一对象,而且希望确保这种类型的对象数目不超过一个。、
解决方案:保证一个实例
参与者与协作者:客户对象只能通过getInstance接口创建单件实例
效果:客户对象无需要操心是否已存在单件实例,这是由单件类自己控制的
实现:添加一个类的私有的静态成员变量,引用所需要的对象。添加一人公共静态方法,当在成员为空是创建这个类实例,并返回类成员变量的值。将构造函数设为私有。
动机:让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建(通过截取创建新对象的请求),并且它可以提供一个访问该实例的方法。
单例是设计模式中比较简单的一个模式,其实现也比较简单,下面给出多线程安全的单例模式实现。
class Test { public: static Test* Instance() { if(_inst==NULL) { _lock.lock(); if(_inst==NULL) _inst = new Test(); } return _inst; } int init_member(); private: Test(); Lockable _lock; static Test* _inst; }; Test* Test::_inst=0; int main() { Test* single = Test::instance(); if(single->init_member()!=0) { //do err handling } //other code return 0; }
理解和扩展单例模式的核心是“如何控制用户使用new对一个类的实例构造器的任意调用”。例如将构造函数的调用转移到其他类中。
单件模式的使用并限于模仿实现上面的单件类,而是控制对类的构造函数的任意调用。
相关文章推荐
- 【设计模式】java单实例模式代码示例
- 设计模式与实例代码:Bridge模式
- 设计模式与实例代码:Composite模式
- 设计模式与实例代码:Visitor模式
- Java设计模式之装饰者模式详解和代码实例
- Ruby使用设计模式中的代理模式与装饰模式的代码实例
- 设计模式实例代码
- PHP设计模式之适配器模式代码实例
- PHP设计模式之观察者模式(Observer)详细介绍和代码实例
- 设计模式与实例代码:Adapter模式
- 【设计模式】java生产者和消费者的代码实例
- [设计模式](四):建造者模式(Builder)与原型模式(Prototype)[含Kotlin深克隆实例代码]
- 30. 代码实例-设计模式-回调方式使用模板方法
- 设计模式与实例代码:Observer模式
- 设计模式实例与代码:Prototype模式
- 29. 代码实例-设计模式-模板方法
- PHP设计模式之观察者模式(Observer)详细介绍和代码实例
- PHP设计模式之观察者模式(Observer)详细介绍和代码实例
- 设计模式与实例代码:Proxy模式
- PHP设计模式之适配器模式代码实例