【C++深入浅出】设计模式学习之单例模式

但凡成为大家公认的模式,都是有一些不可小觑的威力,今天分享一个简单的设计模式:单例模式。

单例模式用于一些只希望有一个实例的类或者只希望执行一次的操作:校长只能有一个、老板只能有一个、用户点击弹窗只希望弹出一次。用全局变量等方式也可以实现,但是多了很多判断和处理代码,并且职责模糊,类的唯一实例化是交给调用者进行判断处理的,每调用一次就要做一次判断,重复了很多工作量,如果是多线程编程,不好的同步设计更是会导致程序卡顿。

如果还在为这些重复工作苦恼,是时候着手单例模式了:设计简单、调用方便、一劳永逸。

用一句话来描述单例模式:私有化的构造函数和公有化的静态获取实例方法。

单例模式设计的示例比较简单,不做赘述:

//饿汉式单例

class
singletonhungry

{

public:

static
singletonhungry* GetInstance();

private:

static
singletonhungry* m_Ins;

singletonhungry(){}

singletonhungry(const
singletonhungry&) {}

};

//static成员的初始化在进入main函数之前完成,随程序退出而终结生命,对象在程序生命周期内一直存在且单例

singletonhungry*
singletonhungry::m_Ins = new singletonhungry;

singletonhungry*
singletonhungry::GetInstance()

{

return
m_Ins;

};

//懒汉式单例

class
singletonlazy

{

public:

static
singletonlazy* GetInstance();

private:

static
singletonlazy* m_Ins;

singletonlazy()
{}

singletonlazy(const
singletonlazy&) {}

};

singletonlazy*
singletonlazy::m_Ins = NULL;

singletonlazy*
singletonlazy::GetInstance()

{

if(m_Ins ==
NULL)

{

//仅在程序需要对象时才被加载

m_Ins = new
singletonlazy;

}

return
m_Ins;

};

//多线程模式的懒汉单例

class
multithreadsingletonlazy

{

public:

static
multithreadsingletonlazy* GetInstance();

private:

static
multithreadsingletonlazy* m_Ins;

static HANDLE
hMutex;

multithreadsingletonlazy()
{}

multithreadsingletonlazy(const
multithreadsingletonlazy& ) {}

};

multithreadsingletonlazy*
multithreadsingletonlazy::m_Ins = NULL;

HANDLE
multithreadsingletonlazy::hMutex = CreateMutex(NULL, FALSE,
TEXT("singleton"));

multithreadsingletonlazy*
multithreadsingletonlazy::GetInstance()

{

if(m_Ins ==
NULL)

{

WaitForSingleObject(hMutex,
INFINITE);

if(m_Ins ==
NULL)

{

m_Ins = new
multithreadsingletonlazy;

}

ReleaseMutex(hMutex);

}

return
m_Ins;

}

//验证一下是否同一个实例

void
foo45()

{

singletonlazy*
lazy1 = singletonlazy::GetInstance();

singletonlazy*
lazy2 = singletonlazy::GetInstance();

singletonhungry*
hungry1 = singletonhungry::GetInstance();

singletonhungry*
hungry2 = singletonhungry::GetInstance();

multithreadsingletonlazy*
msl1 = multithreadsingletonlazy::GetInstance();

multithreadsingletonlazy*
msl2 = multithreadsingletonlazy::GetInstance();

if(lazy1 ==
lazy2)

{

cout
<< "lazy1 equal to lazy2" << endl;

}

if(hungry1 ==
hungry2)

{

cout
<< "hungry1 equal to hungry2" << endl;

}

if(msl1 ==
msl2)

{

cout
<< "msl1 equal to msl2" << endl;

}

}

仅用了13行就完成了非常实用的单例模式,仔细想一想,还真是有点小激动呢!

小结:单例模式和简单工厂模式有一些内在的共通特性,职责内敛,由类本身负责实例,所有的外界调用者只需要打声招呼“嗨,给我一个实例”,大大减少了重复代码和错误概率,本身的实现也很简单,时时记得这个好帮手哟。

时间: 2024-12-16 13:02:55

【C++深入浅出】设计模式学习之单例模式的相关文章

【我的设计模式学习】单例模式

单例模式大概是最直观的一种设计模式了.尽管直观却不简单. 数学与逻辑学中,singleton定义为"有且仅有一个元素的集合".单例模式可以如下定义:"一个类有且仅有一个实例,并且自行实例化向整个系统提供". 我比较喜欢Design Patterns 一书中的描述"保证一个类仅有一个实例,并提供一个访问它的全局访问点". 单例模式的特点 1.单例类只能有一个实例. 2.单例类必须自己自己创建自己的唯一实例. 3.单例类必须给所有其他对象提供这一实例

设计模式学习01—单例模式

一.动机与定义 系统中有些资源只能有一个,或者一个就够,多个浪费.例如一个系统只能有一个窗口管理器或文件系统.一个系统只能有一个计时器或序号生成器.web系统只能有一个页面计数器等等.此时,最好就需要把这些资源设置成有且仅有一个实例. 代码中也就是如何保证一个类只有一个实例并且这个实例能够被访问呢?只有一个实例的就意味着不能让其他类来实例化,也就是只能自己实例化自己.能够被访问也就意味着自身要对外提供全局方法来获取到这个实例,这就是单例模式. 单例模式定义:确保某一个类只有一个实例,而且自行实例

Java设计模式学习01——单例模式(转)

原地址:http://blog.csdn.net/xu__cg/article/details/70182988 Java单例模式是一种常见且较为简单的设计模式.单例模式,顾名思义一个类仅能有一个实例,并且向整个系统提供这一个实例. 单例模式的特点: 单例类仅能有一个实例. 单例类必须为自己创建实例. 单例类必须向外界提供获取实例的方法. 以下是几种实现方法 一.懒汉式单例(能够延时加载) public class SingleTon { private static SingleTon ins

C#设计模式学习笔记-单例模式

最近在学设计模式,学到创建型模式的时候,碰到单例模式(或叫单件模式),现在整理一下笔记. 在<Design Patterns:Elements of Resuable Object-Oriented Software>中的定义是:Ensure a class only has one instance,and provide a global point of access to.它的主要特点不是根据客户程序调用生成一个新的实例,而是控制某个类型的实例数量-唯一一个.(<设计模式-基于C

深入浅出设计模式学习笔记:一

设计模式 1.定义:是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结 2.优点:代码复用,易于维护,易于理解性,保证代码的可靠性 3.分类:设计模式分为3种类型,共23种模式 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中

设计模式学习系列——单例模式

单例模式 单例模式(Singleton Pattern),在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例.即一个类只有一个对象实例. 优点:1)在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如首页页面缓存). 2)避免对资源的多重占用(比如写文件操作). 缺点:违背了"单一职责原则",该类既是工厂又是产品(自己创建了自己): 从具体实现角度来说,就是以下三点: 一是单例模式的类只提供私有的构造函数, 二

Java设计模式学习记录-单例模式

前言 已经介绍和学习了两个创建型模式了,今天来学习一下另一个非常常见的创建型模式,单例模式. 单例模式也被称为单件模式(或单体模式),主要作用是控制某个类型的实例数量是一个,而且只有一个. 单例模式 单例模式的实现方式 实现单例模式的方式有很多种,大体上可以划分为如下两种. 外部方式 在使用某些全局对象时,做一些“try-Use”的工作.就是如果要使用的这个全局对象不存在,就自己创建一个,把它放到全局的位置上:如果本来就有,则直接拿来使用. 内部实现方式 类型自己控制正常实例的数量,无论客户程序

设计模式学习之单例模式

一.单例模式实现方式 常见的 1.饿汉方式 示例代码: package com.mt.singleton;/** * 设计模式单例模式之饿汉实现方式 * 线程安全,调用效率高,但无法实现延迟加载 * @author MT * */public class SingletonDemo1 { private static SingletonDemo1 s = new SingletonDemo1(); //私有化构造器 private SingletonDemo1(){   } //添加获取对象的公

设计模式学习 之 单例模式

单例模式: 定义 一个类有且仅有一个实例,并且自行实例化向整个系统提供. <来自百科> 这些 概念和要点 是 了解 单例模式的 一些基本概念 C# 单例实现要点 Singleton模式是限制而不是改进类的创建. Singleton类中的实例构造器可以设置为Protected以允许子类派生. Singleton模式一般不要支持Icloneable接口,因为这可能导致多个对象实例,与Singleton模式的初衷违背. Singleton模式一般不要支持序列化,这也有可能导致多个对象实例,这也与Si