设计模式C++生成器模式
2016-04-04 17:03
441 查看
定义
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
生成器(Builder)模式是一步步构建一个复杂的产品,它允许用户可以只通过指定复杂对象的类型和内容就可以构建它们,用户不知道内部的具体构建细节。
Builder基类创建复杂产品(Product)全过程的抽象基类。Builder基类提供若干个构造部件(BuildPart)的方法(基类提供缺省实现)。具体构建产品的过程由ConcreteBuilder实现,GetResult()是获取构造完成后的对象(该方法并不在基类中!因为产品Product一般没有抽象基类。如果产品有抽象基类,GetResult就可以放在基类里)。
Director在构造函数中调用Builder的构造部件方法,当最后一个部件方法调用完成后,就产生了一个复杂的产品。Director的作用是封装一个产品的各个部件装配过程。
Builder基类将公共的部分提取出来,各个部件方法(BuildPart)由子类扩展实现。
Director中聚合了Builder基类指针,这样可以适应不同的具体构建者。
1、Builder.h
2、Builder.cpp
3、Client.cpp
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
生成器(Builder)模式是一步步构建一个复杂的产品,它允许用户可以只通过指定复杂对象的类型和内容就可以构建它们,用户不知道内部的具体构建细节。
Builder基类创建复杂产品(Product)全过程的抽象基类。Builder基类提供若干个构造部件(BuildPart)的方法(基类提供缺省实现)。具体构建产品的过程由ConcreteBuilder实现,GetResult()是获取构造完成后的对象(该方法并不在基类中!因为产品Product一般没有抽象基类。如果产品有抽象基类,GetResult就可以放在基类里)。
Director在构造函数中调用Builder的构造部件方法,当最后一个部件方法调用完成后,就产生了一个复杂的产品。Director的作用是封装一个产品的各个部件装配过程。
Builder基类将公共的部分提取出来,各个部件方法(BuildPart)由子类扩展实现。
Director中聚合了Builder基类指针,这样可以适应不同的具体构建者。
1、Builder.h
#ifndef _BUILDER_H_ #define _BUILDER_H_ class BuilderS { public : virtual void makeFun1(int m)=0; virtual void makeFun2(int m)=0; virtual int getResult()=0; }; class DirectorS { private : BuilderS* builder; public : DirectorS(BuilderS *b) { this->builder=b; } //建造过程 int construct(); }; //1#制造者 class BuilderOne:public BuilderS { private : int result; public : BuilderOne(int r):result(r){} virtual void makeFun1(int m); virtual void makeFun2(int m); virtual int getResult(); }; //2#制造者 class BuilderTwo:public BuilderS { private : int result; public : BuilderTwo(int r):result(r){} virtual void makeFun1(int m); virtual void makeFun2(int m); virtual int getResult(); }; #endif
2、Builder.cpp
#include "Builder.h" int DirectorS::construct() { builder->makeFun1(10); builder->makeFun2(2); builder->makeFun2(3); return builder->getResult(); } void BuilderOne::makeFun1(int m){ result+=m; } void BuilderOne::makeFun2(int m) { result*=m; } int BuilderOne::getResult() { return result; } void BuilderTwo::makeFun1(int m){ result*=m; } void BuilderTwo::makeFun2(int m) { result+=m; } int BuilderTwo::getResult() { return result; }
3、Client.cpp
#include <iostream> #include <string> #include "Builder.h" using namespace std; int main() { //1# BuilderS * builder=new BuilderOne(10); DirectorS * director=new DirectorS(builder); cout<<director->construct()<<endl; //2# builder=new BuilderTwo(10); director=new DirectorS(builder); cout<<director->construct()<<endl; system("pause"); return 0; }