设计模式C++实现

上传人:lis****210 文档编号:182638796 上传时间:2023-01-26 格式:DOCX 页数:5 大小:14.40KB
返回 下载 相关 举报
设计模式C++实现_第1页
第1页 / 共5页
设计模式C++实现_第2页
第2页 / 共5页
设计模式C++实现_第3页
第3页 / 共5页
点击查看更多>>
资源描述
分类:设计模式2011-08-06 22:08 2494人阅读评论(9)收藏举报软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中 运用了面向对象编程语言的重要特性:封装、继承、多态,真正领悟设计模式的精髓是可能一个 漫长的过程,需要大量实践经验的积累。最近看设计模式的书,对于每个模式,用C+写了个 小例子,加深一下理解。主要参考大话设计模式和设计模式:可复用面向对象软件的基础 (DP)两本书。本文介绍单例模式的实现。单例的一般实现比较简单,下面是代码和UML图。由于构造函数是私有的,因此无法通过 构造函数实例化,唯一的方法就是通过调用静态函数Get In sta nee。UML 图:Singletpnsingleton : Singleton *station GetlristanceQSingletonO代码:epp view plaincopyp rint?1. /Singleton.h2. class Singleton3. 4. public:5. static Singleton* GetInstance();6. private:7. Singleton() 8. static Singleton *singleton;9. ;10. /Singleton.cpp11. Singleton* Singleton:singleton = NULL;12. Singleton* Singleton:GetInstance()13. 14. if(singleton = NULL)15. singleton = new Singleton();16. return singleton;17. 这里只有一个类,如何实现Singleton类的子类呢?也就说Singleton有很多子类,在一种 应用中,只选择其中的一个。最容易就是在Get In sta nee函数中做判断,比如可以传递一个字符 串,根据字符串的内容创建相应的子类实例。这也是DP书上的一种解法,书上给的代码不全。 这里重新实现了一下,发现不是想象中的那么简单,最后实现的版本看上去很怪异。在VS2008 下测试通过。epp view plaincopyp rint?1. /Singleton.h2. #pragma once3. #include 4. using namespace std;5.5. class Singleton6. 7. public:8. static Singleton* GetInstance(const char* name);9. virtual void Show() 10. protected: /必须为保护,如果是私有属性,子类无法访问父类的构造函数11. Singleton() 12. private:13. static Single ton *single ton; /唯一实例的指针14. ;16.15. /Singleton.cpp16. #include Singleton.h17. #include SingletonA.h18. #include SingletonB.h19. Singleton* Singleton:singleton = NULL;20. Singleton* Singleton:GetInstance(const char* name)21. 22. if(singleton = NULL)23. 24. if(strcmp(name, SingletonA) = 0)25. singleton = new SingletonA();26. else if(strcmp(name,SingletonB) = 0)27. singleton = new SingletonB();28. else29. singleton = new Singleton();30. 31. return singleton;32. cpp view plaincopyprint?1. /SingletonA.h2. #pragma once3. #include Singleton.h4. class SingletonA: public Singleton5. 6. friend class Single ton; /必须为友元类,否则父类无法访问子类的构造函数7. public:8. void Show() coutSingletonAendl; 9. private:为保护属性,这样外界无法通过构造函数进行实例化10. SingletonA() 11. ;12. /SingletonB.h13. #pragma once14. #include Singleton.h15. class SingletonB: public Singleton16. 17. friend class Single ton; /必须为友元类,否则父类无法访问子类的构造函数18. public:19. void Show() coutSingletonBShow();6.return 0;7.上面代码有一个地方很诡异,父类为子类的友元,如果不是友元,函数Getlnstanee会报 错,意思就是无法调用SingletonA和SIngletonB的构造函数。父类中调用子类的构造函数,我 还是第一次碰到。当然了把Sin gleto nA和Sin gleto nB的属性设为public,Get In sta nee函数就 不会报错了,但是这样外界就可以定义这些类的对象,违反了单例模式。看似奇怪,其实也容易解释。在父类中构建子类的对象,相当于是外界调用子类的构造函 数,因此当子类构造函数的属性为私有或保护时,父类无法访问。为共有时,外界就可以访问子 类的构造函数了,此时父类当然也能访问了。只不过为了保证单例模式,所以子类的构造函数不 能为共有,但是又希望在父类中构造子类的对象,即需要调用子类的构造函数,这里没有办法才 出此下策:将父类声明为子类的友元类。
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 办公文档 > 解决方案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!