博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式C++实现(4)——单例模式
阅读量:7252 次
发布时间:2019-06-29

本文共 2127 字,大约阅读时间需要 7 分钟。

hot3.png

软 件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态,真正领悟设计模式 的精髓是可能一个漫长的过程,需要大量实践经验的积累。最近看设计模式的书,对于每个模式,用C++写了个小例子,加深一下理解。主要参考《大话设计模 式》和《设计模式:可复用面向对象软件的基础》(DP)两本书。本文介绍单例模式的实现。

      单例的一般实现比较简单,下面是代码和UML图。由于构造函数是私有的,因此无法通过构造函数实例化,唯一的方法就是通过调用静态函数GetInstance。

      UML图:

      代码:

//Singleton.hclass Singleton  {public:	static Singleton* GetInstance();private:	Singleton() {}	static Singleton *singleton;};//Singleton.cppSingleton* Singleton::singleton = NULL;Singleton* Singleton::GetInstance(){	if(singleton == NULL)		singleton = new Singleton();	return singleton;}

       这里只有一个类,如何实现Singleton类的子类呢?也就说Singleton有很多子类,在一种应用中,只选择其中的一个。最容易就是在 GetInstance函数中做判断,比如可以传递一个字符串,根据字符串的内容创建相应的子类实例。这也是DP书上的一种解法,书上给的代码不全。这里 重新实现了一下,发现不是想象中的那么简单,最后实现的版本看上去很怪异。在VS2008下测试通过。

//Singleton.h#pragma once#include 
using namespace std;class Singleton {public: static Singleton* GetInstance(const char* name); virtual void Show() {}protected: //必须为保护,如果是私有属性,子类无法访问父类的构造函数 Singleton() {}private: static Singleton *singleton; //唯一实例的指针};//Singleton.cpp#include "Singleton.h"#include "SingletonA.h"#include "SingletonB.h"Singleton* Singleton::singleton = NULL;Singleton* Singleton::GetInstance(const char* name){ if(singleton == NULL) { if(strcmp(name, "SingletonA") == 0) singleton = new SingletonA(); else if(strcmp(name,"SingletonB") == 0) singleton = new SingletonB(); else singleton = new Singleton(); } return singleton;}
//SingletonA.h#pragma once#include "Singleton.h"class SingletonA: public Singleton{	friend class Singleton; //必须为友元类,否则父类无法访问子类的构造函数public:	void Show() { cout<<"SingletonA"<
#include "Singleton.h"int main(){	Singleton *st = Singleton::GetInstance("SingletonA");	st->Show();	return 0;}

       上面代码有一个地方很诡异,父类为子类的友元,如果不是友元,函数GetInstance会报错,意思就是无法调用SingletonA和 SIngletonB的构造函数。父类中调用子类的构造函数,我还是第一次碰到。当然了把SingletonA和SIngletonB的属性设为 public,GetInstance函数就不会报错了,但是这样外界就可以定义这些类的对象,违反了单例模式。

       看似奇怪,其实也容易解释。在父类中构建子类的对象,相当于是外界调用子类的构造函数,因此当子类构造函数的属性为私有或保护时,父类无法访问。为共有 时,外界就可以访问子类的构造函数了,此时父类当然也能访问了。只不过为了保证单例模式,所以子类的构造函数不能为共有,但是又希望在父类中构造子类的对 象,即需要调用子类的构造函数,这里没有办法才出此下策:将父类声明为子类的友元类。

转载于:https://my.oschina.net/iamhere/blog/417585

你可能感兴趣的文章
BPMN 2.0规范详解
查看>>
每天学习一个LINUX命令:pwd 显示当前目录(Print-Working-Directory)
查看>>
2.27linux和windows互传文件 3.1 用户配置文件和密码配置文件 3.2 用户组管理
查看>>
linux下yum三种搭建方法
查看>>
QTP对日前控件的处理
查看>>
前端技术/前端冷知识集锦
查看>>
RGW Usage类解析
查看>>
模板引擎缓存
查看>>
php 5.6.11添加模块
查看>>
matlab-线性代数 根据二次型写矩阵
查看>>
Win 7 deskhelp
查看>>
Sybase SQL Anywhere 7 数据库修复成功
查看>>
发展到1Gbps及其以上的速度
查看>>
TurboMail为企业提供海量投递邮件群发系统
查看>>
Linux系统命令Cut使用
查看>>
我的友情链接
查看>>
chrome 跨域设置-(完善博客内容)
查看>>
12月8日学习内容整理:ORM中的创建多表关系,基于多表关系的插入记录,基于对象的跨表查询...
查看>>
利用nginx实现负载均衡
查看>>
【EXCRT模板】POJ2891/LuoGu4777Strange Way to Express Integers拓展中国剩余定理
查看>>