design pattern的学习和思考(2)

原创 2007年09月20日 23:22:00

生成器(Builder)

生成器和抽象工厂非常的相似,都是用来生成对象的,生成器主要着重于一步步的创建一个复杂对象,并且在最后返回结果,而抽象工厂着重于创建一系列的对象,并且在创建后立即返回。
先看一下下面的代码

class ProductPartA
{}
class ProductPartB
{}
class ComplexProduct
{
public:
    
void AddPartA(ProductPartA* partA){ m_PartAList.push_back(partA);}
    
void AddPartB(ProductPartB* partB){ m_PartBList.push_back(partB);}
            
private:
    vector
<ProductPartA*> m_PartAList;
    vector
<ProductPartB*> m_PartBList;
}

这段代码描述了一个复杂对像ComplexProduct,它由PartA的一个list和PartB的一个list组成,要创建这样一个对象就非常适合用生成器的设计模式,我们定义一个生成器

class ComplexProductBuilder
{
public:
    
virtual void BuildProduct()
    { 
        m_Product 
= new ComplexProduct;
    }
    
virtual void BuildPartA()
    {
        ProductPartA
* partA = new ProductPartA;
        m_Product
->AddPartA(partA);
    }
    
virtual void BuildPartB()
    {
        ProductPartB
* partB = new ProductPartB;
        m_Product
->AddPartB(partB);
    }
    ComplexProduct
* GetProduct()
    {
        
return m_Product;
    }
private:
    ComplexProduct
* m_Product;
}

有了这样一个生成器,我们就可以方便的生成一个ComplexProduct,假设ComplexProduct需要包含两个PartA,一个PartB

void CreateComplexProduct(const ComplexProductBuilder* builder)
{
    builder
->BuilderProduct();
    builder
->BuilderPartA();
    builder
->BuilderPartA();
    builder
->BuilderPartB();
}

ComplexProductBuilder builder;
CreateComplexProduct(
&builder);
ComplexProduct
* p = builder.GetProduct();

可以看到,生成器帮我们全权代理了对象的整个构建过程,使其与对象的表现形式所分开,另一方面我们还可以通过继承来实现各种我们所需要的生成器,一个特殊的例子就是,我们可以通过生成器来给对象计数,再看上面的例子,如果我们需要知道PartA和PartB的个数,就可以构建一个计数的生成器来实现

class ComplexProductCountBuilder
{
public:
    
virtual void BuildProduct()
    { 
        m_PartACnt 
= 0;
        m_PartBCnt 
= 0;
    }
    
virtual void BuildPartA()
    {
        m_PartACnt
++;
    }
    
virtual void BuildPartB()
    {
        m_PartBCnt
++;
    }
    
int GetPartACnt(){ return m_PartACnt;    }
    
int GetPartBCnt(){ return m_PartBCnt;    }
private:
    
int m_PartACnt;
    
int m_PartBCnt;
}

//调用
ComplexProductCountBuilder cntBuilder;
CreateComplexProduct(
&cntBuilder);
int PartACount = cntBuilder.GetPartACnt();
int PartBCount = cntBuilder.GetPartBCnt();

是不是非常的方便,一点也不用修改原来的代码。通常,如果一个对象是通过其他对象组合的方式得到的,就可以考虑使用生成器模式

最后给大家一张生成器的UML图来方便大家理解

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

07/11/2014 J2EE 学习笔记 Design Pattern Observer,Singleton et Iterator

Observeur  N Observable 1 LibData: Observable AfficheCourant: AfficheStat: Affi...

Head First Design Pattern_P2

  • 2010-11-11 11:02
  • 19MB
  • 下载

Design Pattern Interview Questions - Part 2

Interpeter , Iterator , Mediator , Memento and Observer design patterns.   (I) what is Interpr...

Head First Design Pattern-en.part2

  • 2008-09-30 17:07
  • 25.02MB
  • 下载

J2ee Design Pattern

  • 2007-07-31 11:32
  • 1.17MB
  • 下载

Head First 设计模式 Design Pattern 1-2 Strategy, Observer

Section 1 策略模式 Strategy 模式:经验复用, 软件开发是在不断调整改变的 设计原则 找出应用中需要变化的部分, 把他们从不需要变化的代码中独立(封装)出来;  >分开变化和...

Design Pattern实验指导手册2

  • 2011-08-16 17:36
  • 125KB
  • 下载

j2ee design pattern

  • 2009-12-02 03:08
  • 1.17MB
  • 下载

Java Design Pattern 2

Single Design pattern对于单例模式的理解,我将之描述为:单例模式只拥有一个实例,它的实例由自己构建,并将之提供给其它对象。 # 单例模式用于解决一个类对象频繁实例化和销毁等问题...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)