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

    建造者

    目的:

    Separate the construction of a complex object from its representation so that
    the same construction process can create different representations.

    将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

    与工厂模式对比

    Builder模式和AbstractFactory模式在功能上很相似,因为都是用来创建大的复杂的对象,它们的区别是:Builder模式强调的是一步步创建对象,并通过相同的创建过程可以获得不同的结果对象,一般来说Builder模式中对象不是直接返回的。而在AbstractFactory模式中对象是直接返回的,AbstractFactory模式强调的是为创建多个相互依赖的对象提供一个同一的接口。建造者模式最主要功能是基本方法的调用顺序安排,也就是这些基本方法已经实现了;而工厂方法则重点是创建,你要什么对象我创造一个对象出来,组装顺序则不是他关心的。

    C++实现:

    至少包括4个类:产品类,抽象建造类,具体建造类和导演类,产品类提供具体的实现接口,抽象建造类为具体建造类提供统一的方法,具体建造类包含一商品对象,并实现具体的方法,导演类包含一抽象建造类对象,对通过一公有方法,统一安排 具体建造类的方法。

    示例代码: 

    //builder.h
    #include <iostream>
    #include <string>
    using namespace std;
    
    class product
    {
    private:
        string m_partA;
        string m_partB;
        string m_partC;
    public:
        void setPartA(string A);
        void setPartB(string B);
        void setPartC(string C);
        string getPartA();
        string getPartB();
        string getPartC();
        
    };
    
    class abstractbuilder
    {
    public:
        virtual void buildPartA()=0;
        virtual void buildPartB()=0;
        virtual void buildPartC()=0;
        virtual product getProduct()=0; //返回指针与返回变量的区别
    };
    
    class concreteBuilder1:public abstractbuilder
    {
    public:
        virtual void buildPartA();
        virtual void buildPartB();
        virtual void buildPartC();
        product getProduct();
    private:
        product m_product;
    };
    
    class  concreteBuilder2:public abstractbuilder
    {
    public:
        virtual void buildPartA();
        virtual void buildPartB();
        virtual void buildPartC();
        product getProduct();
    protected:
    private:
        product m_product;
    };
    
    class Director
    {
    public:
        Director(abstractbuilder *builder);
        ~Director();
        void construct();
    //private:
        abstractbuilder *m_builder;
    };
    
    //builder.cpp
    #include "builder.h"
    void product::setPartA(string A)
    {
        m_partA=A;
    }
    
    void product::setPartB(string B)
    {
        m_partB=B;
    }
    
    void product::setPartC(string C)
    {
        m_partC=C;
    }
    
    string product::getPartA()
    {
        return m_partA;
    }
    
    string product::getPartB()
    {
        return m_partB;
    }
    
    string product::getPartC()
    {
        return m_partC;
    }
    
    void concreteBuilder1::buildPartA()
    {
        m_product.setPartA("build1partA");
    }
    
    void concreteBuilder1::buildPartB()
    {
        m_product.setPartB("build1PartB");
    }
    
    void concreteBuilder1::buildPartC()
    {
        m_product.setPartC("build1PartC");
    }
    
    product concreteBuilder1::getProduct()
    {
        return this->m_product;
    }
    
    
    void concreteBuilder2::buildPartA()
    {
        m_product.setPartA("build2partA");
    }
    
    void concreteBuilder2::buildPartB()
    {
        m_product.setPartB("build2PartB");
    }
    
    void concreteBuilder2::buildPartC()
    {
        m_product.setPartC("build2PartC");
    }
    
    product concreteBuilder2::getProduct()
    {
        return this->m_product;
    }
    void Director::construct()
    {
        m_builder->buildPartA();
        m_builder->buildPartB();
        m_builder->buildPartC();
    }
    
    Director::Director(abstractbuilder *builder)
    {
        this->m_builder=builder;
    }
    Director::~Director()
    {
        if (m_builder!=NULL)
        {
            delete m_builder;
            m_builder=NULL;
        }
    
    }
    
    //main.cpp
    #include "builder.h"
    void main()
    {
        Director* pDirector = new Director(new concreteBuilder1());
            pDirector->construct();
        cout<<pDirector->m_builder->getProduct().getPartA();
        
            Director* pDirector1 = new Director(new concreteBuilder2());
            pDirector1->construct();
        cout<<endl<<pDirector1->m_builder->getProduct().getPartA()<<endl;
    
            return;
    }
    View Code

    参考文献

    C++设计模式实现--建造者

    C++设计模式-Builder建造者模式

    设计模式--建造者模

  • 相关阅读:
    AJAX实例演示加载xml
    入门AJAX总结
    My97 DatePicker一款好用的日历控件
    SQL Server 安装错误 错误代码:0x800F0906的解决方案
    JS实现动态添加和删除DIV
    .Net之路(九).ashx来实现ajax用户名的验证
    善良公社项目总结之如何从前台向后台传输数据
    MySQL数据分析(16)— 数据操作之增删改查
    字典-Python基础前传(9)
    MYSQL之事务
  • 原文地址:https://www.cnblogs.com/gjianw217/p/3870688.html
Copyright © 2011-2022 走看看