创建者模式(builder)

本文介绍建造者模式的作用、模型及操作流程,通过C++代码示例详细解释如何使用该模式来构建复杂对象,如带有墙、门和窗的房子。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、        作用

创建一个复杂的对象,该对象有多个组成部分,一一创建完后再组装起来。书上说是创建与表示分离。

二、        模型图

 

 创建者模式(builder) - 长空飞雪 - 我的菜鸟日记

三、        参与者

builder:一个,抽象的创建接口,封装了各个部分的创建方法。

concretebuilder:多个,具体负责产品的各个部分的创建。

director:一个,负责调用各个concretebuilder的创建方法,组装成产品。

product:一个,创建出来的复杂产品。

四、        操作流程

生成一个concretebuilder,传给director,由它来创建产品。

五、        比较

与抽象工厂模式相比,它仅能得到一个产品,而抽象工厂模式可以创建出一系列的产品。创建者模式创建产品要经过一个复杂的过程,而抽象工厂直接创建。

六、        C++实现

建造房子,它由墙,门,窗组成。

以下是C++代码实现:

 

#include <iostream>

 

class Wall

{

public:

    Wall(int color):m_color(color){}

private:

    int m_color;

};

class Door

{

public:

    Door(int color):m_color(color){}

private:

    int m_color;

};

class Win

{

public:

    Win(int color):m_color(color){}

private:

    int m_color;

};

class House

{

public:

    void AddWall(Wall *pWall){m_pWall = pWall;}

    void AddDoor(Door *pDoor){m_pDoor = pDoor;}

    void AddWin(Win *pWin){m_pWin = pWin;}

    Wall *GetWall(void){return m_pWall;}

    Door *GetDoor(void){return m_pDoor;}

    Win *GetWin(void){return m_pWin;}

private:

    Wall *m_pWall;

    Door *m_pDoor;

    Win *m_pWin;

};

 

class HouseBuilder

{

public:

    enum{REDHOUSE, BLUEHOUSE, WHITEHOUSE};

 

    virtual void BuildHouse(void){}

    virtual void BuildWall(void){}

    virtual void BuildDoor(void){}

    virtual void BuildWin(void){}

    virtual House *GetProduct(void){return NULL;}

    virtual void DestroyHouse(House *pHouse){}

};

class RedHouseBuilder: public HouseBuilder

{

public:

    RedHouseBuilder(void){m_pHouse = NULL;}

 

    void BuildHouse(void)

    {

        m_pHouse = new House;

    }

    void BuildWall(void)

    {

        if (m_pHouse != NULL)

        {

            Wall *pWall = new Wall(REDHOUSE);

            m_pHouse->AddWall(pWall);

        }

    }

    void BuildDoor(void)

    {

        if (m_pHouse != NULL)

        {

            Door *pDoor = new Door(REDHOUSE);

            m_pHouse->AddDoor(pDoor);

        }

    }

    void BuildWin(void)

    {

        if (m_pHouse != NULL)

        {

            Win *pWin = new Win(REDHOUSE);

            m_pHouse->AddWin(pWin);

        }

    }

    House *GetProduct(void)

    {

        return m_pHouse;

    }

    void DestroyHouse(House *pHouse)

    {

        if (pHouse == NULL)

            return;

 

        Wall *pWall = pHouse->GetWall();

        delete pWall;

        Door *pDoor = pHouse->GetDoor();

        delete pDoor;

        Win *pWin = pHouse->GetWin();

        delete pWin;

 

        delete pHouse;

    }

 

private:

    House *m_pHouse;

};

 

class HouseDirector

{

public:

    HouseDirector(HouseBuilder *pBuilder){m_pBuilder = pBuilder;}

 

    void construct(void)

    {

        if (m_pBuilder == NULL)

            return;

        m_pBuilder->BuildHouse();

        m_pBuilder->BuildWall();

        m_pBuilder->BuildDoor();

        m_pBuilder->BuildWin();

    }

 

private:

    HouseBuilder *m_pBuilder;

};

 

 

int main(int argc, char **argv)

{

    House *pRedHouse;

 

    RedHouseBuilder Builder;

    HouseDirector Director(&Builder);

    Director.construct();

 

    pRedHouse = Builder.GetProduct();

    Builder.DestroyHouse(pRedHouse);

 

    return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值