C++设计模式[2]
[入库:2005年8月19日] [更新:2007年3月24日]
上面是示例而非实例,你也许更愿意看看它实际的运用。去下载作者所写的代码,好好欣赏一下吧。
| c++设计模式之abstract factory |
|
2002-07-23· · ··com集中营
|
一、功能 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
二、结构图 类厂最基本的结构示意图如下:
在实际应用中,类厂模式可以扩充到很复杂的情况,如下图所示:
三、优缺点
优点:(1)封装创建过程。客户不用知道类厂是如何创建类实例的,类厂封闭了所有创建的细节。这样可选择不同的创建方法,增加了灵活性。 (2)将客户与具体类隔离,提高了各自的可重用性。 缺点:factory类层次与具体类层次通常是平行的(即一一对应的)。增加一个具体类,一般也要相应地增加一个factory类,增加了系统复杂度。
四、实现 (1)abstract factory类中通常是一组factory method的集合。个人认为与factory method模式没有本质区别。
(2)通常可以把工厂作为单件。
五、示例代码
namespace designpattern_abstractfactory
{
class abstractproducta {}; // product a
class producta1 : public abstractproducta {};
class producta2 : public abstractproducta {};
class abstractproductb {}; // product b class productb1 : public abstractproductb {}; class productb2 : public abstractproductb {}; class abstractfactory { public: virtual abstractproducta* createproducta() = 0 ;// 创建producta virtual abstractproductb* createproductb() = 0 ;// 创建productb } ; class concretefactory1 : public abstractfactory { public: virtual abstractproducta* createproducta() { return new producta1() ; } virtual abstractproductb* createproductb() { return new productb1() ; } static concretefactory1* instance() { static concretefactory1 instance ; return &instance ; } protected: concretefactory1() {} private: concretefactory1(const concretefactory1&) ; concretefactory1& operator=(const concretefactory1&) ; } ; class concretefactory2 : public abstractfactory { public: virtual abstractproducta* createproducta() { return new producta2() ; } virtual abstractproductb* createproductb() { return new productb2() ; } static concretefactory2* instance() { static concretefactory2 instance ; return &instance ; } protected: concretefactory2() {} private: concretefactory2(const concretefactory2&) ; concretefactory2& operator=(const concretefactory2&) ; } ; }
客户端代码:
{ using namespace designpattern_abstractfactory ; // 第一种创建方法
abstractfactory *pfactory = concretefactory1::instance() ; abstractproducta *pproducta = pfactory->createproducta() ; abstractproductb *pproductb = pfactory->createproductb() ;
// 第二种创建方法 pfactory = concretefactory2::instance() ; pproducta = pfactory->createproducta() ; pproductb = pfactory->createproductb() ; }
六、实例 最早知道类厂的概念是在com中,但当时也没想到这是如此重要的一种模式,在许多其他模式中都可以用到类厂模式。 com中不能直接创建组件,这也是由com的一个特性决定的:即客户不知道要创建的组件的类名。 |
| c++设计模式之singleton |
|
2002-07-26· · ··com集中营
|
| 一、功能
保证一个类仅有一个实例。
二、结构图

三、优缺点
singleton模式是做为"全局变量"的替代品出现的。所以它具有全局变量的特点:全局可见、贯穿应用程序的整个生命期,它也具有全局变量不具备的性质:同类型的对象实例只可能有一个。
四、实现
教科书上的singleton定义如下:
|
class singleton { public: static singleton* instance() ; protected: singleton() {} private: static singleton *_instance ; singleton(const singleton&) ; singleton& operator=(const singleton&) ; } ;
singleton* singleton::_instance = null ;
singleton* singleton::instance() { (_instance == null) ? _instance = new singleton() : 0 ; //lazy initialization return _instance ; } |
(1)因为返回的是指针,为防止用户调用delete函数,可把static singleton *_instance;改为在instance()中定义static singleton _instance。这样显然更安全,同时也具有lazy initialization的特性(即第一次访问时才创建)。
(2)假设需要从singleton派生子类,而子类也需要有同样的性质,既只能创建一个实例。我觉得,这很难办。根本原因在于instance()函数不是虚函数,不具有多态的性质。一种常用方法是把instance()函数移到子类中,这时就只能用static singleton *_instance,而不能用static singleton _instance了,除非把_instance也要移到子类,无论怎么做都不优雅。另一种方法是用模板。具体用什么方法,只能根据实际情况权衡。
五、示例代码
(1)没子类的情况
|
namespace designpattern_singleton {
class singleton { public: static singleton* instance() { static singleton _instance ; return &_instance ; } protected: singleton() {} private: singleton(const singleton&) ; singleton& operator=(const singleton&) ; } ; }
客户端代码: { using namespace designpattern_singleton ; singleton *p = singleton::instance() ; ...... } |
(2)有子类的情况
|
方法一: namespace designpattern_singleton { // class singleton class singleton { protected: singleton() {} static singleton *_instance ; private: singleton(const singleton&) ; singleton& operator=(const singleton&) ; } ; singleton* singleton::_instance = null ;
// class concretesingleton class concretesingleton : public singleton { public: static singleton* instance() ; protected: concretesingleton() {} } ;
singleton* concretesingleton::instance() { (_instance == null) ? _instance = new concretesingleton() : 0 ; return _instance ; } }
客户端代码: { using namespace designpattern_singleton ; singleton *p = concretesingleton::instance() ; }
方法二: namespace designpattern_singleton { // class singleton class singleton { protected: singleton() {} private: singleton(const singleton&) ; singleton& operator=(const singleton&) ; } ;
// class concretesingleton class concretesingleton : public singleton { public: static singleton* instance() { static concretesingleton _instance ; return &_instance ; } protected: concretesingleton() {} } ; }
客户端代码: { using namespace designpattern_singleton ; singleton *p = concretesingleton::instance() ; }
方法三: namespace designpattern_singleton { template < class t > class singleton { public: static t* instance() { static t _instance ; return &_instance ; } protected: singleton() {} private: singleton(const singleton &) ; singleton& operator=(const singleton&) ; } ;
class concretesingleton : public singleton< concretesingleton > {} ; }
客户端代码 { using namespace designpattern_singleton ;
concretesingleton *p = concretesingleton::instance() ; } | |
本文关键:C++设计模式
本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)