singleton(单件)-对象创建型模式
1.意图
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
2.动机
对一些类来说,只有一个实例是很重要的。让类自身负责保存它唯一的实例,这个类可以保证没有其他实例可以被创建(通过截取创建新对象的请求),并且它可以提供一个访问该实例的方法。
3.适用性
- 当类只能有一个实例而且客户可以从一个周所周知的访问点访问它时。
- 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。
4.结构

5.代码实例
#include <iostream>
#include <Windows.h> //静态成员实例的懒汉模式 class Singleton
{
public:
static CRITICAL_SECTION gSection;
static Singleton * GetInstance()
{
InitializeCriticalSection(&gSection);
EnterCriticalSection(&gSection);
if(NULL == m_pSingleton)
{
m_pSingleton = new Singleton();
}
return m_pSingleton;
LeaveCriticalSection(&gSection);
} void Print()
{
std::cout<<"Singleton is Created"<<std::endl;
} private:
static Singleton* m_pSingleton;
Singleton()
{
} };
CRITICAL_SECTION Singleton::gSection; Singleton* Singleton::m_pSingleton = NULL;
静态成员实例的懒汉模式
注意此实例的构造函数为私有的以防止使用时实例化此类。此实例加了临界区(也可加锁)以保证单例的线程安全,频繁加锁可能会有性能问题(处理大量数据时)。
class SingletonInside
{
public:
static CRITICAL_SECTION CriticalSection;
static SingletonInside * GetInstance()
{
InitializeCriticalSection(&CriticalSection);
EnterCriticalSection(&CriticalSection);
static SingletonInside instace;
return &instace;
LeaveCriticalSection(&CriticalSection); } void Print()
{
std::cout<<"SingletonInside is Created"<<std::endl;
} private:
SingletonInside()
{
}
};
CRITICAL_SECTION SingletonInside::CriticalSection;
内部静态变量型饿汉模式
此内部静态变量只会初始化一次,因此每次获取实例时,获取的为同一个实例。
class SingletonStatic
{
public:
static const SingletonStatic * GetInstance()
{
return m_SingletonInstance;
} void Print()
{
std::cout<<"SingletonStatic is Created"<<std::endl;
} private:
static const SingletonStatic * m_SingletonInstance;
SingletonStatic()
{
} }; const SingletonStatic* SingletonStatic::m_SingletonInstance = new SingletonStatic();
饿汉模式
静态成员初始化在进入main函数之前已经完成,此种实现没有争夺锁的性能问题。
#include "Singleton.h" int main()
{
auto pSingltonInstacne = Singleton::GetInstance();
pSingltonInstacne->Print(); auto pSingltonInside = SingletonInside::GetInstance();
pSingltonInside->Print(); auto pSingltonStatic = SingletonStatic::GetInstance();
pSingltonStatic->Print(); while(); }
Test.cpp
6.测试结果

7.效果
- 对唯一实例的受控访问
- 缩小名空间
- 允许对操作和表示的精化
- 允许可变数目的实例
- 比类操作更灵活
singleton(单件)-对象创建型模式的更多相关文章
- 设计模式01: Singleton 单例模式(创建型模式)
Singleton 单例模式(创建型模式) 动机(Motivation)当进行软件开发是会有这样一种需求:在系统中只有存在一个实例才能确保它们的逻辑正确性.以及良好的效率.这应该是类设计者的责任,而不 ...
- 设计模式(3)-对象创建型模式-Abstract Factory模式
1.对象创建型模式 1.3 Abstract Factory模式 1.3.1 需求 在下面情况能够使用Abstract Factory模式: • 一个系统要独立于它的产品的创建. ...
- 设计模式(4)-对象创建型模式-Prototype模式
1.对象创建型模式 1.4 Protoype模式 1.4.1需求 通过拷贝原形对象创建新的对象. 1.4.2结构 •P r o t o t y p e(Gr a p h i c) - ...
- Singleton模式——对象创建型模式
Singleton模式即为单例模式/单件模式. (一)意图--保证一个类仅有一个实例,并提供一个访问它的全局访问点. 如一台计算机可以有多个端口,但是应该统一管理这些端口,避免访问冲突.--选择Sin ...
- 对象创建型模式------Singleton(单例模式)
地址:http://blog.csdn.net/wuzhekai1985/article/details/6665869.仅供自己参考学习. 单例模式:保证一个类仅有一个实例,并提供一个访问它的全局节 ...
- 设计模式可复用面向对象软件设计基础之对象创建型模式—ABSTRACT FACTORY( 抽象工厂)
意图 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 适用性 在以下情况可以使用 Abstract Factory模式 • 一个系统要独立于它的产品的创建.组合和表示时. • 一 ...
- ProtoType(原型)-对象创建型模式
1.意图 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 2.动机 通过拷贝或者“克隆”一个类的实例来创建新的实例. 3.适用性 当一个系统应该独立于它的产品创建.构成和表示时,要使 ...
- Builder(生成器)-对象创建型模式
一.意图 将一个复杂对象的构建与它的表示分离,使得同样的构造过程可以创建不同的表示. 二.动机 一个复杂的对象的构造过程中,原料相同,可能会要求生产不同的产品,并且生产的产品种类还能够方便的增加.Bu ...
- 对象创建型模式------Builder(生成器)
本文系转载,转载地址http://blog.sina.com.cn/s/blog_59b6af690100zj3l.html,只供自己学习使用. 假设现在有三种产品,是玩具,都是由三部分组成,头,身体 ...
随机推荐
- QString转换为char* (转)
Qt下面,字符串都用QString,确实给开发者提供了方便,想想VC里面定义的各种变量类型,而且函数参数类型五花八门,经常需要今年新那个类型转换 Qt再使用第三方开源库时,由于库的类型基本上都是标准的 ...
- 聊一下JS中的作用域scope和闭包closure
聊一下JS中的作用域scope和闭包closure scope和closure是javascript中两个非常关键的概念,前者JS用多了还比较好理解,closure就不一样了.我就被这个概念困扰了很久 ...
- nova-scheduler start flow
- Tomcat长出现的内存溢出问题
以下内容转载自博客:http://www.cnblogs.com/apaqi/archive/2012/07/09/2582480.html 在eclipse.ini配置文件中加上以下两行 -XX:P ...
- web页面打开本地app(判断是否安装)
在应用宝中有APP申请链接: //是否可以打开App不可以跳则到下载页 $(".downNow button").on("click",function(){ ...
- nodejs初探(二)第一个nodejs程序“hello world”
直接用文本编辑器编写helloworld.js,保存在桌面 var http = require("http"); http.createServer(function(reque ...
- WCF netTcp配置
服务端配置 <system.serviceModel> <bindings> <netTcpBinding> <binding name="netT ...
- 【javascript基础】8、闭包
前言 函数和作用域啥的我们前面已经了解了,现在就要学习闭包了,这是一个挺晦涩的知识点,初学者可能会感觉不好理解,但是高手都不不以为然了,高手就给我提点意见吧,我和新手一起来学习什么是闭包. 例子 先不 ...
- sqlite 报错:database is locked
在sqlite批量添加数据时,报错:database is locked. 解决办法:将db路径由相对路径设置为绝对路径.
- QT学习之路--菜单、工具条、状态栏
下面一些是 Menu Bar,用于显示菜单;再下面一点事 Toolbar areas,用于显示工具条,Status Bar,就是状态栏. Qt 提供了一个 QStatusBar 类来实现状态栏. Qt ...