design pattern的学习和思考(2)
来源:互联网 发布:数据录入系统 编辑:程序博客网 时间:2024/06/07 19:29
生成器(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;
}
{}
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;
}
{
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();
{
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();
{
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图来方便大家理解
- design pattern的学习和思考(2)
- design pattern的学习和思考(1)
- design pattern的学习和思考(3)
- design pattern的学习和思考(4)
- 《Design Pattern》下的思考
- Design Pattern学习笔记之适配和外观(the Adapter and Facade Pattern)
- Design Pattern学习笔记之迭代器模式和复合模式(the Iterator and Composite Pattern)
- Java Design Pattern(2)
- Design Pattern学习笔记(一)
- Design Pattern学习笔记(三)
- 设计模式(design pattern) 学习记录
- Design Pattern学习笔记之装饰(Decorator Pattern)
- Design Pattern学习笔记之单例(Singleton Pattern)
- Design Pattern学习笔记之命令(Command Pattern)
- C++基本功和 Design Pattern系列(2)
- Design Pattern(2)-Strategy Pattern
- Design pattern学习笔记 – observer pattern
- Design Pattern 2-Factory
- 糟糕的政策是不是比没有政策更糟糕呢?
- 月光博客测试
- 用Visual C++操作INI文件
- Programming Flex2 - 六.布局的管理
- Learning WTL8.0
- design pattern的学习和思考(2)
- 简单实用的c++快速排序模板类
- 《pro Spring》学习笔记之Spring+Axis1.4开发WebService实例
- Window消息传递机制
- 明天老外要上课,先准备一下词汇:)
- [原创]关于PDU模式接收短信,千万可别被误导
- 最近的进度.........
- perl CPAN模块安装的配置文件
- 在textbox中输入值后,单击回车,指定调用哪一个按钮的方法