C++设计模式[2]

[入库:2005年8月19日] [更新:2007年3月24日]

本文简介:选择自 csenior 的 blog

  上面是示例而非实例,你也许更愿意看看它实际的运用。去下载作者所写的代码,好好欣赏一下吧。


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浏览器)

go top