将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.
main.cc:
/* design_patterns:"builder" In the production of mobile phones, for example, now the mobile phone manufacturers will launch high-end, midrange, low-end configuration version, the basic configuration of most of them, only a few key parts are different, it is very suitable for the use of Builder mode high-end :835 Processor,5.5 inch Panel,8G Memory. midrange :820 Processor,4.7 inch Panel,4G Memory. low-end :810 Processor,4.0 inch Panel,2G Memory. */ #include "builder.h" #include "high_phone_builder.h" #include "normal_phone_builder.h" #include "low_phone_builder.h" #include "director.h" #include "phone.h" #include <windows.h> #include <iostream> void main(){ //create director Director *director = new Director(); Builder *high_builder = new HighPhoneBuilder(); director->SetBuilder(high_builder); //create high-end phone Phone *high_phone = director->AssemblePhone(); high_phone->ShowConfig(); Builder *normal_builder = new NormalPhoneBuilder(); director->SetBuilder(normal_builder); //create midrange phone Phone *normal_phone = director->AssemblePhone(); normal_phone->ShowConfig(); Builder *low_builder = new LowPhoneBuilder(); director->SetBuilder(low_builder); //create low-end phone Phone *low_phone = director->AssemblePhone(); low_phone->ShowConfig(); //clear delete high_builder; delete normal_builder; delete low_builder; delete director; cout << "ending!" << endl; system("Pause"); }Director:
//director.h #ifndef HELENDP_SOURCE_DIRECTOR_H_ #define HELENDP_SOURCE_DIRECTOR_H_ #include "phone.h" #include "builder.h" class Director{ public: Director(); ~Director(); Phone *AssemblePhone(); void SetBuilder(Builder *builder); private: Builder *builder_; }; #endif //director.cc #include "director.h" #include "builder.h" Director::Director(){ } Director::~Director(){ } Phone *Director::AssemblePhone(){ builder_->AssembleStepOne(); builder_->AssembleStepTwo(); builder_->AssembleStepThree(); return builder_->GetPhone(); } void Director::SetBuilder(Builder *builder){ builder_ = builder; }Builder:
//builder.h #ifndef HELENDP_SOURCE_BUILDER_H_ #define HELENDP_SOURCE_BUILDER_H_ #include <string> #include "phone.h" using namespace std; class Builder{ public: Builder(); virtual ~Builder(); virtual void AssembleStepOne() = 0; virtual void AssembleStepTwo() = 0; virtual void AssembleStepThree() = 0; virtual Phone* GetPhone() = 0; }; #endif //builder.cc #include "builder.h" #include <iostream> using namespace std; Builder::Builder(){ } Builder::~Builder(){ }HighPhoneBuilder:
//high_phone_builder.h #ifndef HELENDP_SOURCE_HIGH_PHONE_BUILDER_H_ #define HELENDP_SOURCE_HIGH_PHONE_BUILDER_H_ #include "builder.h" #include "Phone.h" class HighPhoneBuilder:public Builder{ public: HighPhoneBuilder(); ~HighPhoneBuilder(); void AssembleStepOne(); void AssembleStepTwo(); void AssembleStepThree(); Phone* GetPhone(); private: Phone *phone_; }; #endif //high_phone_builder.cc #include "high_phone_builder.h" HighPhoneBuilder::HighPhoneBuilder(){ phone_ = new Phone(); } HighPhoneBuilder::~HighPhoneBuilder(){ delete phone_; } void HighPhoneBuilder::AssembleStepOne(){ phone_->AssembleProcessor("SnapDragon835"); } void HighPhoneBuilder::AssembleStepTwo(){ phone_->AssembleMemory("8G Memory"); } void HighPhoneBuilder::AssembleStepThree(){ phone_->AssemblePanel("5.5 inch panel"); } Phone* HighPhoneBuilder::GetPhone(){ return phone_; }LowPhoneBuilder:
//low_phone_builder.h #ifndef HELENDP_SOURCE_LOW_PHONE_BUILDER_H_ #define HELENDP_SOURCE_LOW_PHONE_BUILDER_H_ #include "builder.h" #include "phone.h" class LowPhoneBuilder:public Builder{ public: LowPhoneBuilder(); ~LowPhoneBuilder(); void AssembleStepOne(); void AssembleStepTwo(); void AssembleStepThree(); Phone* GetPhone(); private: Phone* phone_; }; #endif //low_phone_builder.cc #include "low_phone_builder.h" LowPhoneBuilder::LowPhoneBuilder(){ phone_ = new Phone(); } LowPhoneBuilder::~LowPhoneBuilder(){ delete phone_; } void LowPhoneBuilder::AssembleStepOne(){ phone_->AssembleProcessor("SnapDragon810"); } void LowPhoneBuilder::AssembleStepTwo(){ phone_->AssembleMemory("2G Memory"); } void LowPhoneBuilder::AssembleStepThree(){ phone_->AssemblePanel("4.0 inch panel"); } Phone* LowPhoneBuilder::GetPhone(){ return phone_; }NormalPhoneBuilder:
//normal_phone_builder.h #ifndef HELENDP_SOURCE_NORMAL_PHONE_BUILDER_H_ #define HELENDP_SOURCE_NORMAL_PHONE_BUILDER_H_ #include "builder.h" #include "phone.h" class NormalPhoneBuilder:public Builder{ public: NormalPhoneBuilder(); ~NormalPhoneBuilder(); void AssembleStepOne(); void AssembleStepTwo(); void AssembleStepThree(); Phone* GetPhone(); private: Phone* phone_; }; #endif //normal_phone_builder.cc #include "normal_phone_builder.h" NormalPhoneBuilder::NormalPhoneBuilder(){ phone_ = new Phone(); } NormalPhoneBuilder::~NormalPhoneBuilder(){ delete phone_; } void NormalPhoneBuilder::AssembleStepOne(){ phone_->AssembleProcessor("SnapDragon820"); } void NormalPhoneBuilder::AssembleStepTwo(){ phone_->AssembleMemory("4G Memory"); } void NormalPhoneBuilder::AssembleStepThree(){ phone_->AssemblePanel("4.7 inch panel"); } Phone* NormalPhoneBuilder::GetPhone(){ return phone_; }Phone:
//phone.h #ifndef HELENDP_SOURCE_PHONE_H_ #define HELENDP_SOURCE_PHONE_H_ #include <string> using namespace std; /* Mobile phone includes processor, memory, panel and other basic configuration */ class Phone{ public: Phone(); ~Phone(); void AssembleProcessor(string processor); void AssembleMemory(string memory); void AssemblePanel(string panel); void ShowConfig(); private: string processor_; string memory_; string panel_; string base_config_; }; #endif //phone.cc #include "phone.h" #include <iostream> using namespace std; Phone::Phone(){ base_config_ = "base config"; } Phone::~Phone(){ } void Phone::AssembleProcessor(string processor){ processor_ = processor; } void Phone::AssembleMemory(string memory){ memory_ = memory; } void Phone::AssemblePanel(string panel){ panel_ = panel; } void Phone::ShowConfig(){ cout << "ShowConfig:" << endl; cout << base_config_ << endl; cout << processor_ << endl; cout << memory_ << endl; cout << panel_ << endl << endl; }代码和UML图(EA)工程文件,最后会整理打包上传.