Chinaunix首页 | 论坛 | 博客
  • 博客访问: 147677
  • 博文数量: 27
  • 博客积分: 531
  • 博客等级: 一等列兵
  • 技术积分: 332
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-25 18:31
文章分类

全部博文(27)

文章存档

2015年(4)

2014年(3)

2013年(6)

2012年(14)

我的朋友

分类: Delphi

2012-06-09 15:46:01

     有一段时间没有写博客了,看来坚持还真不是一件那么容易的事情,还好我及时的记得要再来看看。今天奉上的是建造者模式;
     建造者模式的本质是,指挥者有一个建造者的引用,而建造者对外是统一的建造接口,并且建造者和指定的产品相关联,这样,在给指挥者不同的建造者实例,则可以得到不同的产品。
     建造者模式是在当创建复杂对象的算法应该独立于对象的组成部分以及他们的装配方式时使用 (抄书,呵呵)。

代码如下:
1. builder.h

点击(此处)折叠或打开

  1. #ifndef _BUILDER_H_
  2. #define _BUILDER_H_

  3. #include "product.h"

  4. class Builder
  5. {
  6. public:
  7.     virtual void buildPartA() = 0;
  8.     virtual void buildPartB() = 0;
  9.     virtual Product* getResult() = 0;
  10. };

  11. #endif
2. product.h

点击(此处)折叠或打开

  1. #ifndef _PRODUCT_H_
  2. #define _PRODUCT_H_

  3. #include <vector>
  4. #include <string>
  5. using namespace std;

  6. class Product
  7. {
  8. public:
  9.     void addPart(string part);
  10.     void show();

  11. private:
  12.     vector<string> m_parts;
  13. };

  14. #endif
3. product.cpp

点击(此处)折叠或打开

  1. #include <iostream>
  2. #include "product.h"
  3. using namespace std;

  4. void Product::addPart(string part)
  5. {
  6.     m_parts.push_back(part);
  7. }

  8. void Product::show()
  9. {
  10.     vector<string>::iterator iter = m_parts.begin();
  11.     while(iter != m_parts.end())
  12.     {
  13.         cout << "<" << *iter << ">" << endl;
  14.         iter++;
  15.     }
  16. }
4. director.h

点击(此处)折叠或打开

  1. #ifndef _DIRECTOR_H_
  2. #define _DIRECTOR_H_

  3. #include "builder.h"

  4. class Director
  5. {
  6. public:
  7.     void contruct(Builder* builder);
  8. };

  9. #endif
5. director.cpp

点击(此处)折叠或打开

  1. #include "director.h"

  2. void Director::contruct(Builder* builder)
  3. {
  4.     builder->buildPartA();
  5.     builder->buildPartB();
  6. }
6. concrete_builder.h

点击(此处)折叠或打开

  1. #ifndef _C_BUILDER_H_
  2. #define _C_BUILDER_H_

  3. #include "builder.h"
  4. #include "product.h"

  5. class ConcreteBuilder : public Builder
  6. {
  7. public:
  8.     ConcreteBuilder();
  9.     ~ConcreteBuilder();
  10.     void buildPartA();
  11.     void buildPartB();
  12.     Product* getResult();

  13. private:
  14.     Product* m_product;
  15. };

  16. #endif
7. concrete_builder.cpp

点击(此处)折叠或打开

  1. #include "concrete_builder.h"

  2. ConcreteBuilder::ConcreteBuilder()
  3. {
  4.     m_product = new Product();
  5. }

  6. ConcreteBuilder::~ConcreteBuilder()
  7. {
  8.     if(m_product != NULL)
  9.     {
  10.         delete m_product;
  11.     }
  12. }

  13. void ConcreteBuilder::buildPartA()
  14. {
  15.     m_product->addPart("part x");
  16. }

  17. void ConcreteBuilder::buildPartB()
  18. {
  19.     m_product->addPart("part y");
  20. }

  21. Product* ConcreteBuilder::getResult()
  22. {
  23.     return m_product;
  24. }
8. test.cpp

点击(此处)折叠或打开

  1. #include "director.h"
  2. #include "builder.h"
  3. #include "product.h"
  4. #include "concrete_builder.h"

  5. int main(int argc, char* argv[])
  6. {
  7.     Director director;
  8.     Builder* builder = new ConcreteBuilder();

  9.     director.contruct(builder);
  10.     Product* product = builder->getResult();

  11.     product->show();

  12.     delete builder;
  13. }
运行结果:

点击(此处)折叠或打开

  1. ./test
  2. <part x>
  3. <part y>


阅读(1350) | 评论(0) | 转发(0) |
0

上一篇:原型模式

下一篇:linux文件系统理解

给主人留下些什么吧!~~