创建型之建造者模式C++实现

2022-06-16 15:08:23 浏览数 (2)

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

将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的

优点:

  1. 各个具体的建造者相互独立,有利于系统的扩展。
  2. 客户端不必知道产品内部组成的细节,便于控制细节风险。

缺点:产品的组成部分必须相同,这限制了其使用范围。如果产品的内部变化复杂,该模式会增加很多的建造者类。

主要角色:

  1. 产品角色:包含多个组成部件的复杂对象,由具体建造者来创建其各个部件。
  2. 抽象建造者:一个包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回复杂产品的方法 getResult()。
  3. 具体建造者:实现 Builder 接口,完成复杂产品的各个部件的具体创建方法。
  4. 指挥者:调用建造者对象中的部件构造与装配方法完成复杂对象的创建,在指挥者中不涉及具体产品的信息。

第一步:产品角色

代码语言:javascript复制
//产品角色
//包含多个组成部件的复杂对象
class People
{
    public:
        void setHead(string head)
        {
            this->head=head;
            cout<<head<<endl;
        }
        void setBody(string body)
        {
            this->body=body;
            cout<<body<<endl;
        }
        void setHand(string hand)
        {
            this->hand=hand;
            cout<<hand<<endl;
        }
        void setFeet(string feet)
        {
            this->feet=feet;
            cout<<feet<<endl;
        }
        void show()
        {
            cout<<"人人构造完成"<<endl;
        }
    private:
        string head;
        string body;
        string hand;
        string feet;
};

第二步:抽象建造者

代码语言:javascript复制
//抽象建造者
//包含创建产品各个子部件的抽象方法
class BuildPeople
{
    //创建产品对象
    protected:
        People *people=new People();
    public:
        virtual void buildHead()=0;
        virtual void buildBody()=0;
        virtual void buildHand()=0;
        virtual void buildFeet()=0;
    //返回产品对象
        People *getPeople()
        {
            return people;
        }
};

第三步:具体创造者

代码语言:javascript复制
//具体创造者
//实现抽象建造者接口
class ConcreteBuildPeople:public BuildPeople
{
    public:
        void buildHead()
        {
            people->setHead("建造 人的头头");
        }
        void buildBody()
        {
            people->setBody("建造 人的身体");
        }
        void buildHand()
        {
            people->setHand("建造 人的手手");
        }
        void buildFeet()
        {
            people->setFeet("建造 人的脚脚");
        }
};

第四步:指挥者

代码语言:javascript复制
//指挥者
//调用建造者中的方法完成复杂对象的创建
class DirectorPeople
{
    private:
        //抽象类实例化子类
        BuildPeople *builderpeople=new ConcreteBuildPeople();
    public:
        DirectorPeople(BuildPeople *builderpeople)//抽象类实例化
        {
            this->builderpeople=builderpeople;
        }
    //产品构建与组装方法
        People *construct()
        {
            builderpeople->buildHead();
            builderpeople->buildBody();
            builderpeople->buildHand();
            builderpeople->buildFeet();

            return builderpeople->getPeople();
        }
};

第五步:实现

代码语言:javascript复制
#include "p.h"

int main()
{
    BuildPeople *builder=new ConcreteBuildPeople();
    DirectorPeople *director=new DirectorPeople(builder);
    People *people=director->construct();
    people->show();

    return 0;
}

结果显示:

0 人点赞