设计模式之创建者模式

生成器(创建者)模式和工厂模式都属于创建型设计模式。

前一篇文章简述了简单工厂,工厂方法和抽象工厂的差异。那么生成器模式和工厂模式有什么区别呢。

总结下:M为工厂类数,N为产品类数
工厂模式 比例关系为 1:N/M

简单工厂 M=1(无论多少种产品只有一种工厂)
工厂方法 是 M=N(多少种产品就有多少种工厂)
而抽象工厂是 抽象类别 = N/M (在两个产品层级关系下)

而本文所说的生成器模式,则是在一种产品的前提下讨论的。生成器其实不是产生对象,用确切点的话来说可以看成是构造对象,是一个过程。

代码:

/**
 * @author  nhpeng,nhpeng1104@gmail.com
 * @date    2015/08/18 10:08:56 CST
 * @brief   建造者模式
 *
 * 
 */

#include <stdio.h>
#include <string>

class Battle
{
    public:
        Battle( ){};
        ~Battle( ){};

        void SetPartA( std::string partA ){ m_partA = partA; };
        void SetPartB( std::string partB ){ m_partB = partB; };
        void SetPartC( std::string partC ){ m_partC = partC; };
        void SetPartD( std::string partD ){ m_partD = partD; };

        void Show( )
        {   
            printf( "%s - %s - %s - %s\n", m_partA.c_str( ), m_partB.c_str( ), m_partC.c_str( ), m_partD.c_str( ) );
        };  
    private:
        std::string m_partA;
        std::string m_partB;
        std::string m_partC;
        std::string m_partD;
};

class Builder
{
    public:
        Builder( Battle *battle );
        virtual ~Builder( ){};

        virtual void CreateBattle( ){};

    protected:
        Battle *m_battle;
};

Builder::Builder( Battle *battle )
{
    m_battle = battle;
}

class BuilderA : public Builder
{
    public:
        BuilderA( Battle *battle );
        virtual ~BuilderA( ){};

        virtual void CreateBattle( );
};

BuilderA::BuilderA( Battle *battle )
:Builder( battle )
{
}

void BuilderA::CreateBattle( )
{
    m_battle->SetPartA( "BuilderA PartA" );
    m_battle->SetPartB( "BuilderA PartB" );
    m_battle->SetPartC( "BuilderA PartC" );
    m_battle->SetPartD( "BuilderA PartD" );
}

class BuilderB : public Builder
{
    public:
        BuilderB( Battle *battle );
        virtual ~BuilderB( ){};

        virtual void CreateBattle( );
};

BuilderB::BuilderB( Battle *battle )
:Builder( battle )
{
}

void BuilderB::CreateBattle( )
{
    m_battle->SetPartA( "BuilderB PartA" );
    m_battle->SetPartB( "BuilderB PartB" );
    m_battle->SetPartC( "BuilderB PartC" );
    m_battle->SetPartD( "BuilderB PartD" );
}

int main( )
{
    Battle *battle1 = new Battle( );
    BuilderA builderA( battle1 );
    builderA.CreateBattle( );
    battle1->Show( );
    delete battle1;
    Battle *battle2 = new Battle( );
    BuilderB builderB( battle2 );
    builderB.CreateBattle( );
    battle2->Show( );
    delete battle2;
    return 0;
}

自己写一遍就能够理解我上面总结出来的话了。battle1和battle2都不是BuilderA和BuilderB生成的,
他们只是再次构造了一下这两个对象。
两个生成器BuilderA,BuilderB,顺序相同(其实貌似顺序也可以不同的),材料不同(BuilderA PartA,BuilderB PartA),个人觉得构造者模式这个名字挺贴切;

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值