设计模式C++实现——单例模式

模式定义:

单例模式确保一个类只有一个实例,并提供一个全局访问点。

模式结构:

单例模式编程实现及执行结果:

#include <iostream>
using namespace std;

单例类

class Sigleton
{
public:
	static Sigleton* getInstance();
private:
	Sigleton(){}
	static Sigleton* uniqueInstance;
};

静态成员初始化

Sigleton*  Sigleton::uniqueInstance = NULL;

成员函数实现

Sigleton* Sigleton::getInstance()
{
	if(uniqueInstance == NULL)
	{
		uniqueInstance = new Sigleton();
	}

	return uniqueInstance;
}

客户代码

int main()
{
	Sigleton* pSigleton1 = Sigleton::getInstance();
	Sigleton* pSigleton2 = Sigleton::getInstance();

	if(pSigleton1 == pSigleton2)
		cout << "Sigleton  Successful" << endl;
	else
		cout << "Sigleton failue" << endl;

	return 0;
}

执行结果:

Sigleton Successful

请按任意键继续. . .

应用:创建Sigleton类的子类

我们应当考虑Sigleton的多个子类,而且应用必须决定使用哪一个子类。修改Sigleton方法如下:

单例基类

class Sigleton
{
public:
	static Sigleton* getInstance(const char* name);
	virtual void show(){cout << "Sigleton" << endl;}
protected:	//基类构造函数访问权限位protected,使子类构造函数可以调用基类构造函数
	Sigleton(){}
private:
	static Sigleton* uniqueInstance;
}; <pre name="code" class="cpp">Sigleton*  Sigleton::uniqueInstance = NULL;

Sigleton* Sigleton::getInstance(const char* name)
{
	if(uniqueInstance == NULL)
	{
		if(strcmp(name,"SigletonA") == 0)
		{
			uniqueInstance = new SigletonA();
		}
		else if(strcmp(name,"SigletonB") == 0)
		{
			uniqueInstance = new SigletonB();
		}
		else
		{
			uniqueInstance = new Sigleton();
		}
	}
	return uniqueInstance;
}

A类子类

class SigletonA : public Sigleton
{
	//声明基类为友元,使其可以访问A类私有构造函数
	friend class Sigleton;
public:
	void show(){cout << "SigletonA" << endl;}
private:
	SigletonA(){}
};

B子类

class SigletonB : public Sigleton
{
	friend class Sigleton;
public:
	void show(){cout << "SigletonB" << endl;}
private:
	SigletonB(){}
};

客户代码

int main()
{
	Sigleton* pSigleton1 = Sigleton::getInstance("SigletonA");
	Sigleton* pSigleton2 = Sigleton::getInstance("SigletonA");
	Sigleton* pSigleton3 = Sigleton::getInstance("SigletonB");
	Sigleton* pSigleton4 = Sigleton::getInstance("SigletonB");

	if(pSigleton1 == pSigleton2)
		cout << "SigletonA  Successful" << endl;
	else
		cout << "SigletonA failue" << endl;

	pSigleton1->show();
	pSigleton3->show();

	return 0;
}

执行结果:

SigletonA  Successful

SigletonA

SigletonA

请按任意键继续. . .

设计模式C++实现——单例模式

时间: 2024-11-05 20:44:45

设计模式C++实现——单例模式的相关文章

“只生一个娃”--设计模式中的单例模式

"只生一个娃"–设计模式中的单例模式(Singleton) 引言 ??被人问到什么是单例模式,突然回答不上来,似乎印象不深了.回去补了一下功课,突然明白了,原来在项目中一直使用的日志模块即采用了单例模式,只是熟视无睹,没有意识到罢了. ??所谓单例模式(Singleton),即指一个类只有一个实例(Instance),并给外界提供访问该实例的一个全局访问点. ??通常我们可以使用全局变量的方式来实现"只生一个娃",但更好的方法就是:让该类自身负责创建和保存它的唯一实

php设计模式笔记:单例模式

意图: 保证一个类仅有一个实例,并且提供一个全局访问点 单例模式有三个特点: 1.一个类只有一个实例2.它必须自行创建这个实例3.必须自行向整个系统提供这个实例 主要实现: Singleton定义了一个instance操作,允许外部访问它的唯一实例,instance是一个类方法,负责创建它的唯一实例. singleton适用场景: 1.当类只能有一个实例而且外部可以从一个公共的访问点访问它.2.当这个唯一实例应该是通过子类化可扩展的.并且用户应该无需更改代码就能使用一个扩展的实例时. Singl

【白话设计模式四】单例模式(Singleton)

转自:https://my.oschina.net/xianggao/blog/616385 0 系列目录 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factory) [白话设计模式二]外观模式(Facade) [白话设计模式三]适配器模式(Adapter) [白话设计模式四]单例模式(Singleton) [白话设计模式五]工厂方法模式(Factory Method) [白话设计模式六]抽象工厂模式(Abstract Factory) [白话设计模式七]策

PHP设计模式之:单例模式

PHP设计模式之:单例模式  解决多次重复请求问题 前些日子开始着真正的去了解下设计模式,开始么,简单地从单例模式开始,当然网上看了一些资料,单例模式比较好理解,看看介绍,然后看看代码基本也就能够理解了,设计模式这些的花点心思基本的是能够理解的,当然要想很好的运用到项目上也是需要一定的实践,不能只是知道了解,或者说的是很厉害很懂的,一到要实际操作就不行了,废话就不多说了,PHP战线上的同志们都加油吧: 单例模式(职责模式): 简单的说,一个对象(在学习设计模式之前,需要比较了解面向对象思想)只负

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

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

《Java设计模式》之单例模式

在GoF的23种设计模式中,单例模式是比较简单的一种.然而,有时候越是简单的东西越容易出现问题.下面就单例设计模式详细的探讨一下. 所谓单例模式,简单来说,就是在整个应用中保证只有一个类的实例存在.就像是Java Web中的application,也就是提供了一个全局变量,用处相当广泛,比如保存全局数据,实现全局性的操作等. 1. 最简单的实现 首先,能够想到的最简单的实现是,把类的构造函数写成private的,从而保证别的类不能实例化此类,然后在类中提供一个静态的实例并能够返回给使用者.这样,

设计模式攻略——单例模式

单例模式分析 简单说来,单例模式(也叫单件模式)的作用就是保证在整个应用程序的生命周期中, 任何一个时刻,单例类的实例都只存在一个(当然也可以不存在). 需求: 为什么要有单例模式呢,需求才是最根本的原因.那么究竟是为什么呢. 场景1.:需要我们做个winform的用户管理信息系统,那么我们需要有注册吧,ok,添加个注册按钮,点击注册按钮是不是应该弹出个注册的界面呢. 假如你做好了,你的boss来检查,好吧,注册一下吧,一点一个注册界面弹出来了,哎,又一点又一个注册界面出来了,哎,再一点又一个界

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

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

23种设计模式系列之单例模式

本文继续介绍23种设计模式系列之单例模式. 概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯一实例. 3.单例类必须给所有其他对象提供这一实例. 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例.在计算机系统中,线程池.缓存.日志对象.对话框.打印机.显卡的驱动程序对象常被设计成单例.这些应用都或多或少具有资源管理器