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图来方便大家理解

 

人生就是个学习、思考与实践的过程

http://www.21ctcm.com.cn/shenxin/zhenren/1875.html 导读:越来越多的社会人士发出“大学生无用”的声音,那么,有志青年如何脱颖而出?本文天清地宁老...
  • ttwwok
  • ttwwok
  • 2014年04月20日 12:05
  • 2443

java设计模式大全 Design pattern samples in Java(最经典最全的资料)

Design pattern samples in Java.Build status:IntroductionDesign patterns are formalized best practice...
  • changemyself
  • changemyself
  • 2015年06月19日 13:10
  • 9762

快速学习JS的思考方法、有用

当人们尝试学习 JavaScript , 或者其他编程技术的时候,常常会遇到同样的挑战:有些概念容易混淆,特别是当你学习过其他语言的时候。很难找到学习的时间(有时候是动力)。一旦当你理解了一些东西的时...
  • xllily_11
  • xllily_11
  • 2016年10月20日 15:54
  • 2589

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

Observeur  N Observable 1 LibData: Observable AfficheCourant: AfficheStat: Affi...
  • qiriga
  • qiriga
  • 2014年11月09日 04:54
  • 466

J2ee Design Pattern

  • 2007年07月31日 11:32
  • 1.17MB
  • 下载

Head First Design Pattern_P2

  • 2010年11月11日 11:02
  • 19MB
  • 下载

Head First Design Pattern(en) pdf(part2)

  • 2009年09月03日 21:56
  • 20MB
  • 下载

Head First Design Pattern-en.part2

  • 2008年09月30日 17:07
  • 25.02MB
  • 下载

Head First design pattern(中文版).part2.rar

  • 2010年02月16日 18:06
  • 18.12MB
  • 下载

Design Pattern Interview Questions - Part 2

Interpeter , Iterator , Mediator , Memento and Observer design patterns.   (I) what is Interpr...
  • Plutus_Lee
  • Plutus_Lee
  • 2012年12月28日 13:51
  • 488
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:design pattern的学习和思考(2)
举报原因:
原因补充:

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