zoukankan      html  css  js  c++  java
  • 设计模式之建造者模式

      软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态,真正领悟
    设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累。最近看设计模式的书,对于每个模式,用C++写了个小例子,加深一下理解。主要参考《大话设
    计模式》和《设计模式:可复用面向对象软件的基础》(DP)两本书。本文介绍建造者模式的实现。
      建造者模式的定义将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示(DP)。《大话设计模式》举了一个很好的例子——建造
    小人,一共需建造6个部分,头部、身体、左右手、左右脚。与工厂模式不同,建造者模式是在导向者的控制下一步一步构造产品的。建造小人就是在控制下一步步
    构造出来的。创建者模式可以能更精细的控制构建过程,从而能更精细的控制所得产品的内部结构。下面给出建造者模式的UML图,以建造小人为实例。

                                          

      对于客户来说,只需知道导向者就可以了,通过导向者,客户就能构造复杂的对象,而不需要知道具体的构造过程。下面给出小人例子的代码实现

    class Builder  
    {
    public:
    	virtual void BuildHead() {}
    	virtual void BuildBody() {}
    	virtual void BuildLeftArm(){}
    	virtual void BuildRightArm() {}
    	virtual void BuildLeftLeg() {}
    	virtual void BuildRightLeg() {}
    };
    //构造瘦人
    class ThinBuilder : public Builder
    {
    public:
    	void BuildHead() { cout<<"build thin body"<<endl; }
    	void BuildBody() { cout<<"build thin head"<<endl; }
    	void BuildLeftArm() { cout<<"build thin leftarm"<<endl; }
    	void BuildRightArm() { cout<<"build thin rightarm"<<endl; }
    	void BuildLeftLeg() { cout<<"build thin leftleg"<<endl; }
    	void BuildRightLeg() { cout<<"build thin rightleg"<<endl; }
    };
    //构造胖人
    class FatBuilder : public Builder
    {
    public:
    	void BuildHead() { cout<<"build fat body"<<endl; }
    	void BuildBody() { cout<<"build fat head"<<endl; }
    	void BuildLeftArm() { cout<<"build fat leftarm"<<endl; }
    	void BuildRightArm() { cout<<"build fat rightarm"<<endl; }
    	void BuildLeftLeg() { cout<<"build fat leftleg"<<endl; }
    	void BuildRightLeg() { cout<<"build fat rightleg"<<endl; }
    };
    //构造的指挥官
    class Director  
    {
    private:
    	Builder *m_pBuilder;
    public:
    	Director(Builder *builder) { m_pBuilder = builder; }
    	void Create(){
    		m_pBuilder->BuildHead();
    		m_pBuilder->BuildBody();
    		m_pBuilder->BuildLeftArm();
    		m_pBuilder->BuildRightArm();
    		m_pBuilder->BuildLeftLeg();
    		m_pBuilder->BuildRightLeg();
    	}
    };

     客户端调用:

    int main()  
    {  
       FatBuilder thin;  
       Director director(&thin);  
       director.Create();
       return 0;  
    }
  • 相关阅读:
    [POJ 2096] Collecting Bugs
    [POJ 3774] Scout YYF I
    [HDU 4418] Time travel
    [hdu 4586] Play the Dice
    [HDU 4507] 吉哥系列故事――恨7不成妻
    [HDU 4734] F(x)
    [Codeforces] Round #352 (Div. 2)
    刷题向》关于一道像差分约束的数学题BZOJ1045(NORMAL)
    刷题向》关于一道奇怪的贪心(田忌赛马)BZOJ1034(NORMAL-)
    刷题向》关于线段树的区间开根号 BZOJ3211(NORMAL+)
  • 原文地址:https://www.cnblogs.com/wenrenhua08/p/3935986.html
Copyright © 2011-2022 走看看