`

[原创][创建型模式] 建造者模式的理解

 
阅读更多
我的理解
    在实际的项目中,很多时候我们和一些设备的沟通都是通过数据流来完成的。用户和设备通过固定格式的包进行处理。实际项目
中使用的一个实例如下:Application Package Format:{CmdCode}{Type}{P1}{P2}{Len}{Data}
    这样的一个包具有严格的格式,同时不同参数具有不同的意义,这样一来,就可以理解为一个典型的Builder Pattern。

流程:
    用户代表了客户端的行为,所以逻辑如下:
    (1)用户连接设备,按照协议,确定数据包的组成,一个完整的数据包其实本质就一个Product;
    (2)确定数据包的组成部分之后,我们需要确定各个数据组成的先后顺序(Director);实例中,数据包的顺序是1、2、3、4、5;
但是根据不同的情况,修改成4、1、2、3、5,也是很有可能的;
    (3)利用原始的组成数据按照一定顺序组成一个完整的数据包;




头文件
//BuilderPattern.h

#ifndef BUILDER_PATTERN_H
#define BUILDER_PATTERN_H

#include <Windows.h>
#include <string>
using namespace std;

namespace BuilderPattern
{
    class Product
    {
    public:
        Product();
        ~Product();

        void AddPart(string strPart);
        string DisplayProduct();
        void EmptyParts();

    private:
        string m_strFullParts;
    };

    // Base Class
    //////////////////////////////////////////////////////////////////////////
    class AbstractBuilder
    {
    public:
        AbstractBuilder();
        virtual ~AbstractBuilder();

        virtual void BuildHead() = 0;
        virtual void BuildData() = 0;
        virtual void BuildType() = 0;
        virtual void BuildP1P1() = 0;
        virtual void BuildLen() = 0;
        virtual Product* GetProduct() = 0;
    };


    //////////////////////////////////////////////////////////////////////////
    class ConcreteBuilderA : public AbstractBuilder
    {
    public:
        ConcreteBuilderA(Product* pProduct);
        virtual ~ConcreteBuilderA();

        virtual void BuildHead();
        virtual void BuildData();
        virtual void BuildType();
        virtual void BuildP1P1();
        virtual void BuildLen();
        virtual Product* GetProduct();

    private:
        Product* m_pProduct;
    };

    //////////////////////////////////////////////////////////////////////////
    class ConcreteBuilderB : public AbstractBuilder
    {
    public:
        ConcreteBuilderB(Product* pProduct);
        virtual ~ConcreteBuilderB();

        virtual void BuildHead();
        virtual void BuildData();
        virtual void BuildType();
        virtual void BuildP1P1();
        virtual void BuildLen();
        virtual Product* GetProduct();

    private:
        Product* m_pProduct;
    };

    //////////////////////////////////////////////////////////////////////////
    class Director
    {
    public:
        Director(AbstractBuilder* pAbstractBuilder);
        ~Director();
        void Construct1();
        void Construct2();


    private:
        AbstractBuilder* m_pAbstractBuilder;
    };


    //////////////////////////////////////////////////////////////////////////
    void BuilderPattern_Test_A();
    void BuilderPattern_Test_B();

}

#endif

实现
#include "BuilderPattern.h"
#include <iostream>
using namespace std;

namespace BuilderPattern
{

    //////////////////////////////////////////////////////////////////////////
    Product::Product()
    {
    }
    Product::~Product()
    {
    }

    void Product::AddPart(string strPart)
    {
        m_strFullParts += strPart;
    }

    string Product::DisplayProduct()
    {
        cout << m_strFullParts << endl;
        return m_strFullParts;
    }

    void Product::EmptyParts()
    {
        m_strFullParts = "";
    }

    //////////////////////////////////////////////////////////////////////////
    AbstractBuilder::AbstractBuilder()
    {
    }
    AbstractBuilder::~AbstractBuilder()
    {
    }

    //////////////////////////////////////////////////////////////////////////
    ConcreteBuilderA::ConcreteBuilderA(Product* pProduct)
        : m_pProduct(NULL)
    {
        if (pProduct != NULL)
        {
            m_pProduct = pProduct;
        }
    }

    ConcreteBuilderA::~ConcreteBuilderA()
    {
        if (m_pProduct != NULL)
        {
            delete m_pProduct;
            m_pProduct = NULL;
        }
    }

    void ConcreteBuilderA::BuildHead()
    {
        m_pProduct->AddPart("ConcreteBuilderA::BuildHead\n");
    }
    void ConcreteBuilderA::BuildData()
    {
        m_pProduct->AddPart("ConcreteBuilderA::BuildData\n");
    }
    void ConcreteBuilderA::BuildType()
    {
        m_pProduct->AddPart("ConcreteBuilderA::BuildType\n");
    }
    void ConcreteBuilderA::BuildP1P1()
    {
        m_pProduct->AddPart("ConcreteBuilderA::BuildP1P1\n");
    }
    void ConcreteBuilderA::BuildLen()
    {
        m_pProduct->AddPart("ConcreteBuilderA::BuildLen\n");
    }
    Product* ConcreteBuilderA::GetProduct()
    {
        return m_pProduct;
    }


    //////////////////////////////////////////////////////////////////////////
    ConcreteBuilderB::ConcreteBuilderB(Product* pProduct)
        : m_pProduct(NULL)
    {
        if (pProduct != NULL)
        {
            m_pProduct = pProduct;
        }
    }

    ConcreteBuilderB::~ConcreteBuilderB()
    {
        if (m_pProduct != NULL)
        {
            delete m_pProduct;
            m_pProduct = NULL;
        }
    }

    void ConcreteBuilderB::BuildHead()
    {
        m_pProduct->AddPart("ConcreteBuilderB::BuildHea\n");
    }
    void ConcreteBuilderB::BuildData()
    {
        m_pProduct->AddPart("ConcreteBuilderB::BuildData\n");
    }
    void ConcreteBuilderB::BuildType()
    {
        m_pProduct->AddPart("ConcreteBuilderB::BuildType\n");
    }
    void ConcreteBuilderB::BuildP1P1()
    {
        m_pProduct->AddPart("ConcreteBuilderB::BuildP1P1\n");
    }
    void ConcreteBuilderB::BuildLen()
    {
        m_pProduct->AddPart("ConcreteBuilderB::BuildLen\n");
    }
    Product* ConcreteBuilderB::GetProduct()
    {
        return m_pProduct;
    }

    //////////////////////////////////////////////////////////////////////////
    Director::Director(AbstractBuilder* pAbstractBuilder)
        : m_pAbstractBuilder(NULL)
    {
        if (pAbstractBuilder != NULL)
        {
            m_pAbstractBuilder = pAbstractBuilder;
        }
    }
    Director::~Director()
    {
        if (m_pAbstractBuilder != NULL)
        {
            delete m_pAbstractBuilder;
            m_pAbstractBuilder = NULL;
        }
    }
    void Director::Construct1()
    {
        m_pAbstractBuilder->GetProduct()->EmptyParts();

        m_pAbstractBuilder->BuildData();
        m_pAbstractBuilder->BuildType();
        m_pAbstractBuilder->BuildP1P1();
        m_pAbstractBuilder->BuildLen();
        m_pAbstractBuilder->BuildData();

        m_pAbstractBuilder->GetProduct()->DisplayProduct();
    }

    void Director::Construct2()
    {
        m_pAbstractBuilder->GetProduct()->EmptyParts();

        m_pAbstractBuilder->BuildLen();
        m_pAbstractBuilder->BuildData();
        m_pAbstractBuilder->BuildType();
        m_pAbstractBuilder->BuildP1P1();
        m_pAbstractBuilder->BuildData();

        m_pAbstractBuilder->GetProduct()->DisplayProduct();
    }

    //////////////////////////////////////////////////////////////////////////
    void BuilderPattern_Test_A()
    {
        Director* pDirector = new Director(new ConcreteBuilderA(new Product()));

        pDirector->Construct1();
        pDirector->Construct2();

        delete pDirector;
        pDirector = NULL;
    }

    void BuilderPattern_Test_B()
    {
        Director* pDirector = new Director(new ConcreteBuilderB(new Product()));

        pDirector->Construct1();
        pDirector->Construct2();

        delete pDirector;
        pDirector = NULL;
    }
}

客户端
#include "BuilderPattern.h"

#include <iostream>
using namespace std;
using namespace BuilderPattern;

void main()
{
    BuilderPattern_Test_A();
    BuilderPattern_Test_B();
}

运行结果

分享到:
评论

相关推荐

    [浪曦原创]JAVA设计模式 第9讲 建造模式(jzkangta)

    **建造者模式(Builder Pattern)**是Java设计模式中的创建型模式之一,它允许我们分步骤构建一个复杂的对象,而不必一次性完成。这种模式的主要目的是将对象的创建过程与使用过程解耦,使得构建过程可以独立地进行...

    原创-设计模式实现代码

    - 建造者模式(Builder):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 - 寄生构造器模式(Prototype):用原型实例指定创建对象的种类,并且通过复制这个原型来创建新的对象。 ...

    java设计模式_原创

    1. 创建型设计模式:这类模式关注对象的创建过程,它们包括单例模式、工厂方法模式、抽象工厂模式、建造者模式和原型模式。单例模式确保一个类只有一个实例,并提供全局访问点;工厂方法模式定义一个用于创建对象的...

    原创-设计模式学习资料(一些常用模式的类图)

    Builder模式是一种创建型设计模式,它提供了一种分步骤创建复杂对象的方法,使得相同构建过程可以创建不同的表示。Builder模式.vsd可能包含了产品类、具体建造者类和导演类的类图,展示了如何逐步构建产品对象。 ...

    w3school 设计模式教程 飞龙整理 20141001

    1. 创建型模式:关注对象的创建,比如工厂模式(用于创建对象而不暴露创建逻辑)、抽象工厂模式(提供一个创建一系列相关或相互依赖对象的接口)、单例模式(确保一个类只有一个实例)、建造者模式(将复杂对象的...

    设计模式 c# 代码

    建造者模式将复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。在C#中,可以通过定义一个建造者接口和多个具体建造者类,来实现不同类型的对象构建。 五、原型模式(Prototype) 原型模式通过...

    [浪曦原创]JAVA设计模式 第4讲 抽象工厂(jzkangta)

    学习这个模式时,需要注意理解抽象工厂模式与其他创建型模式(如简单工厂、工厂方法和建造者模式)的区别,以及如何在实际项目中合理选择和应用。同时,也要关注模式的优缺点,例如它能很好地封装变化,但可能会导致...

Global site tag (gtag.js) - Google Analytics