网站左侧固定广告代码,中山企业网站建设公司,0元可以注册公司吗,低价网站建设制作设计公司软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性#xff1a;封装、继承、多态#xff0c;真正领悟设计模式的精髓是可能一个漫长的过程#xff0c;需要大量实践经验的积累。最近看设计模式的书#xff0… 软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性封装、继承、多态真正领悟设计模式的精髓是可能一个漫长的过程需要大量实践经验的积累。最近看设计模式的书对于每个模式用C写了个小例子加深一下理解。主要参考《大话设计模式》和《设计模式:可复用面向对象软件的基础》DP两本书。本文介绍单例模式的实现。 单例的一般实现比较简单下面是代码和UML图。由于构造函数是私有的因此无法通过构造函数实例化唯一的方法就是通过调用静态函数GetInstance。 UML图 代码 [cpp] view plaincopyprint? //Singleton.h class Singleton { public: static Singleton* GetInstance(); private: Singleton() {} static Singleton *singleton; }; //Singleton.cpp Singleton* Singleton::singleton NULL; Singleton* Singleton::GetInstance() { if(singleton NULL) singleton new Singleton(); return singleton; } 这里只有一个类如何实现Singleton类的子类呢也就说Singleton有很多子类在一种应用中只选择其中的一个。最容易就是在GetInstance函数中做判断比如可以传递一个字符串根据字符串的内容创建相应的子类实例。这也是DP书上的一种解法书上给的代码不全。这里重新实现了一下发现不是想象中的那么简单最后实现的版本看上去很怪异。在VS2008下测试通过。 [cpp] view plaincopyprint? //Singleton.h #pragma once #include iostream 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; } [cpp] view plaincopyprint? //SingletonA.h #pragma once #include Singleton.h class SingletonA: public Singleton { friend class Singleton; //必须为友元类否则父类无法访问子类的构造函数 public: void Show() { coutSingletonAendl; } private: //为保护属性这样外界无法通过构造函数进行实例化 SingletonA() {} }; //SingletonB.h #pragma once #include Singleton.h class SingletonB: public Singleton { friend class Singleton; //必须为友元类否则父类无法访问子类的构造函数 public: void Show(){ coutSingletonBendl; } private: //为保护属性这样外界无法通过构造函数进行实例化 SingletonB() {} }; [cpp] view plaincopyprint? #include Singleton.h int main() { Singleton *st Singleton::GetInstance(SingletonA); st-Show(); return 0; } 上面代码有一个地方很诡异父类为子类的友元如果不是友元函数GetInstance会报错意思就是无法调用SingletonA和SIngletonB的构造函数。父类中调用子类的构造函数我还是第一次碰到。当然了把SingletonA和SIngletonB的属性设为publicGetInstance函数就不会报错了但是这样外界就可以定义这些类的对象违反了单例模式。 看似奇怪其实也容易解释。在父类中构建子类的对象相当于是外界调用子类的构造函数因此当子类构造函数的属性为私有或保护时父类无法访问。为共有时外界就可以访问子类的构造函数了此时父类当然也能访问了。只不过为了保证单例模式所以子类的构造函数不能为共有但是又希望在父类中构造子类的对象即需要调用子类的构造函数这里没有办法才出此下策将父类声明为子类的友元类。 本人享有博客文章的版权转载请标明出处 http://blog.csdn.net/wuzhekai1985