zoukankan      html  css  js  c++  java
  • 【设计模式】——建造者模式

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

      建造者模式结构图:

      Builder是为创建一个Product对象的各个部件指定的抽象接口;ConcreteBuilder是具体建造者,实现Builder接口,构建和装配各个部件;Product就是产品角色;Director是构建使用Builder接口的对象。

      建造者模式主要用于创建一些复杂的对象,这些对象内部构建间的构造顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化。它的好处就是使得构造代码与表示代码分离,由于建造者隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了。

    建造者模式基本代码:

    #include <iostream>
    #include <vector>
    using namespace std;
    //Product类——产品类,有多个部件组成
    class Product
    {
    private:
        vector<string> parts;
    public:
        void Add(string part)
        {
            parts.push_back(part);
        }
        void Show()
        {
            cout << endl << "产品创建---" << endl;
            vector<string>::iterator iter=parts.begin();
            for(;iter!=parts.end();iter++)
            {
                cout << *iter << endl;
            }
        }
    };
    //Builder类——抽象建造者类,确定产品由两个部件PartA和PartB组成,并声明一个得到产品建造后结果的方法GetResult
    class Builder
    {
    public:
        virtual void BuilderPartA()=0;
        virtual void BuilderPartB()=0;
        virtual Product *GetResult()=0;
    };
    //ConcreteBuilder1类——具体建造者类
    class ConcreteBuilder1:public Builder
    {
    private:
        Product *product = new Product();
    public:
        void BuilderPartA()
        {
            product->Add("部件A");
        }
        void BuilderPartB()
        {
            product->Add("部件B");
        }
        Product *GetResult()
        {
            return product;
        }
    };
    //ConcreteBuilder2类——具体建造者类
    class ConcreteBuilder2:public Builder
    {
    private:
        Product *product = new Product();
    public:
        void BuilderPartA()
        {
            product->Add("部件X");
        }
        void BuilderPartB()
        {
            product->Add("部件Y");
        }
        Product *GetResult()
        {
            return product;
        }
    };
    //Director类——指挥者类
    class Director
    {
    public:
        void Construct(Builder *builder)//用来指挥构建过程
        {
            builder->BuilderPartA();
            builder->BuilderPartB();
        }
    };
    int main()
    {
        Director *director=new Director();
        Builder *b1 = new ConcreteBuilder1();
        Builder *b2 = new ConcreteBuilder2();
        director->Construct(b1);
        Product *p1 = b1->GetResult();
        p1->Show();
    
        director->Construct(b2);
        Product *p2 = b2->GetResult();
        p2->Show();
        return 0;
    }

     总之,建造者模式是在当前创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时适用的模式。

  • 相关阅读:
    014 要区分好slice,splice和split,方法如下
    108 shutil模块(了解)
    107 pathlib模块(了解)
    106 collections模块
    105 typing模块
    104 re模块
    103_01 matplotlib模块
    102 pandas模块
    101 numpy模块
    SQLserver找出执行慢的SQL语句
  • 原文地址:https://www.cnblogs.com/awy-blog/p/3814802.html
Copyright © 2011-2022 走看看