Chinaunix首页 | 论坛 | 博客
  • 博客访问: 329256
  • 博文数量: 49
  • 博客积分: 653
  • 博客等级: 上士
  • 技术积分: 646
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-01 22:43
文章分类

全部博文(49)

文章存档

2018年(1)

2017年(4)

2015年(1)

2014年(6)

2013年(8)

2012年(24)

2011年(5)

分类: C/C++

2017-05-18 18:48:31


建造者模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
例如建造一个车, 宝马先建造车身, 发动机, 车窗, 车轮, 奔驰先造发动机, 车身,车轮, 车窗等等。对于客户来说, 知道造车工厂就可以了, 具体怎么造, 那是汽车工厂的事情。 
使用场景
     当创建复杂对象的算法独立于他的组成部分
     当构造的过程必须允许被构造对象有不同的表示时候

点击(此处)折叠或打开

  1. #include<iostream>
  2. using namespace std;

  3. class Builder {
  4. public:
  5.     virtual ~Builder() {};
  6.     virtual void BuildEngine() =0;
  7.     virtual void BuildWindow() =0;
  8.     virtual void BuildWheel() =0;
  9.     virtual void BuildChassis() =0;

  10. };
  11. class Ben : public Builder {
  12. public:
  13.     void BuildEngine() { cout << "Ben BuildEngine \n"; }
  14.     void BuildWindow() { cout << "Ben BuildWindow\n"; }
  15.     void BuildWheel() { cout << "Ben BuildWheel \n"; }
  16.     void BuildChassis() { cout << "Ben BuildChassis"; }
  17. };
  18. class BMW : public Builder {
  19. public:
  20.     void BuildEngine() { cout << "BMW BuildEngine \n"; }
  21.     void BuildWindow() { cout << "BMW BuildWindow\n"; }
  22.     void BuildWheel() { cout << "BMW BuildWheel \n"; }
  23.     void BuildChassis() { cout << "BMW BuildChassis\n"; }
  24. };

  25. class Direct {
  26. public:
  27.     Direct(Builder *pB) { pb = pB; }
  28.     void Create() {
  29.         pb->BuildEngine();
  30.         pb->BuildWindow();
  31.         pb->BuildChassis();
  32.         pb->BuildWheel();
  33.     }
  34. private:
  35.     Builder *pb;
  36. };

  37. int main(int argc, char* agrv[]) {
  38.     Builder *pC = new BMW();
  39.     Direct *pD = new Direct(pC);
  40.     pD->Create();

  41.     delete pD;
  42.     delete pC;
  43.     return 0;
  44. }
备注:
手绘UML图

Makefile文件

点击(此处)折叠或打开

  1. # set CPUS for Linux or FreeBSD
  2. CPUS := $(shell cat /proc/cpuinfo|grep -c processor)
  3. GCC472_PATH=/usr/local/gcc-4.7.2
  4. CXX := env LD_LIBRARY_PATH=$(GCC472_PATH)/lib:/usr/local/mpc/lib $(GCC472_PATH)/bin/g++
  5. CXXFLAGS := -g3 -O2 -fno-strict-aliasing -Wall -Werror -fPIC \
  6. -isystem /usr/local/include \
  7. -isystem /usr/include
  8. LDFLAGS := -pthread \
  9. -L/usr/local/lib64/ \
  10. -L/usr/local/lib/
  11. RTFLAGS := \
  12. -Wl,-rpath=.. \
  13. -Wl,-rpath=/$(GCC472_PATH)/lib64
  14. LIBS := -lpthread
  15. SRC := $(wildcard *.cc)
  16. OBJ := $(patsubst %.cc, %.o, $(SRC))
  17. DEP := $(patsubst %.o, %.d, $(OBJ))
  18. TARGET := main_test
  19. all:
  20. $(MAKE) -j$(CPUS) target
  21. main_test: $(OBJ)
  22. $(CXX) $^ -o $@ $(RTFLAGS) $(LDFLAGS) $(LIBS)
  23. target: $(TARGET)
  24. %.o : %.cc
  25. $(CXX) -c $(CXXFLAGS) $< -o $@
  26. %.d : %.cc
  27. @$(CXX) -MM $< $(CXXFLAGS) | sed 's/$(notdir $*)\.o/$(subst /,\/,$*).o $(subst /,\/,$*).d/g' > $@
  28. clean:
  29. -rm -rf $(OBJ) $(TARGET) *.core $(DEP) *_unittest
  30. test: all
  31. ./main_test
  32. .PHONY: all target clean test





阅读(873) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~