码迷,mamicode.com
首页 > 其他好文 > 详细

第26章 创建型模式大PK

时间:2016-07-09 10:30:38      阅读:244      评论:0      收藏:0      [点我收藏+]

标签:

26.1 工厂方法模式 VS 建造者模式

26.1.1 按工厂方法建造超人

(1)产品:两类超人,成年超人和未成年超人。

(2)工厂:这里选择简单工厂

【编程实验】工厂方法建造超人

技术分享

//创建型模式大PK——工厂方法和建造者模式
//实例:利用简单工厂创建的超人
#include <iostream>
using namespace std;

//***************************抽象产品接口*********************
//超人接口
class ISuperMan
{
public:
    //每个超人都有特殊的技能
    virtual void specialTalent() = 0;

    virtual ~ISuperMan(){}
};

//*************************具体产品***********************
//成年超人
class AdultSuperMan : public ISuperMan
{
public:
    void specialTalent()
    {
        cout << "超人力大无穷" <<endl;
    }
};

//未成年人超人
class ChildSuperMan : public ISuperMan
{
public:
    void specialTalent()
    {
        cout << "小超人的能力是刀枪不入、快速移动" <<endl;
    }
};

//***********************简单工厂****************************
class SuperManFactory
{
public:
    static ISuperMan* createSuperMan(string type)
    {
        //根据输入参数产生不同的超人
        if(type == "adult")
        {
            return new AdultSuperMan();
        }
        else if (type == "child")
        {
            return new ChildSuperMan();
        }
        else
            return NULL;
    }
};

int main()
{
    //模拟生产超人(注意从生产工厂里出来的产品(如adult)都是一个模
    //样的,没有特殊的地方,这与后面的建造者模式有很大的不同)
    ISuperMan* sm = SuperManFactory::createSuperMan("child");
    //展示一下超人的技能
    sm->specialTalent();

    delete sm;

    return 0;
};

26.1.2 按建造者模式建造超人

(1)产品的三大组成部分:躯体、特殊技能、身份标记

(2)建造者:Builder。注意,与标准的建造者模式不同,这里的部件如何组装的过程由各个具体的建造者负责,而标准的作法是放到Director角色中去完成的。

技术分享

//创建型模式大PK——工厂方法和建造者模式
//实例:利用建造者模式创建的超人
#include <iostream>
using namespace std;

//***************************辅助类*********************
//超人的身驱
class Body
{
    string body;
public:
    string& getBody(){return body;}
    void setBody(string value)
    {
        body = value;
    }
};

//特殊技能
class SpecialTalent
{
    string specialTalent;
public:
    string& getSpecialTalent(){return specialTalent;}
    void setSpecialTalent(string value)
    {
        specialTalent = value;
    }
};

//超人的标志
class SpecialSymbol
{
    string symbol;
public:
    string& getSymbol(){return symbol;}
    void setSymbol(string value)
    {
        symbol = value;
    }
};

//超人
class SuperMan
{
private:
    Body body;
    SpecialSymbol specialSymbol;
    SpecialTalent specialTalent;
public:
    string& getBody(){return body.getBody();}
    void setBody(string value)
    {
        body.setBody(value);
    }

    string& getSpecialTalent(){return specialTalent.getSpecialTalent();}
    void setSepcialTalent(string value)
    {
        specialTalent.setSpecialTalent(value);
    }

    string& getSpecialSymbol(){return specialSymbol.getSymbol();}
    void setSpecialSymbol(string value)
    {
        specialSymbol.setSymbol(value);
    }

    virtual ~SuperMan(){}
};

//*************************Builder角色***********************
//抽象建造者
class Builder
{
protected:
    SuperMan* superMan;
public:
    Builder()
    {
        superMan = new SuperMan();
    }

    //构建出超人的躯体
    void setBody(string value)
    {
        superMan->setBody(value);
    }

    //构建出超人的特殊技能
    void setSpecialTalent(string value)
    {
        superMan->setSepcialTalent(value);
    }

    //构建出超人的特殊标记
    void setSpecialSymbol(string value)
    {
        superMan->setSpecialSymbol(value);
    }

    //构建出一个完整的超人
    //超人的各个部件都准备好了,具体怎么组装由实现类来决定,
    //体现建造者模式将复杂对象的构建和表示分离的意图
    virtual SuperMan* getSuperMan() = 0;

    virtual ~Builder()
    {
        delete superMan;
    }
};

//成年超人建造者
class AdultSuperManBuilder :public Builder
{
public:
    SuperMan* getSuperMan()
    {
        //1.标准的建造者模式,建造过程是放在Director中进行装配的。
        //2.建造者模式关注产品的各个部分,甚至构建顺序,
        //  即相同的部件,装配顺序不同,产生的结果也可能不同,
        //  这正是建造者模式的意图)
        superMan->setBody("强壮的躯体");
        superMan->setSepcialTalent("会飞行");
        superMan->setSpecialSymbol("胸前带S标记");

        return superMan;
    }
};

//未成年超人建造者
class ChildSuperManBuilder :public Builder
{
public:
    SuperMan* getSuperMan()
    {
        //建造过程
        superMan->setBody("强壮的躯体");
        superMan->setSepcialTalent("刀枪不入");
        superMan->setSpecialSymbol("胸前带小S标记");

        return superMan;
    }
};

//导演类
class Director
{
private:
    static Builder* adultBuilder;
    static Builder* childBuilder;
public:
    //本例中,以下函数只是一个空壳,而标准的建造者模式
    //其部件的组装过程是在以下两部函数中完成的!

    //建造一个成人超人
    static SuperMan* getAdultSuperMan()
    {

        return adultBuilder->getSuperMan();
    }

    //建造一个未成年人超人
    static SuperMan* getChildSuperMan()
    {
        return childBuilder->getSuperMan();
    }
};
Builder* Director::adultBuilder = new AdultSuperManBuilder();
Builder* Director::childBuilder = new ChildSuperManBuilder();

int main()
{
    //建造一个超人
    SuperMan* sm = Director::getAdultSuperMan();
    //SuperMan* sm = Director::getChildSuperMan();

    //展示一个超人的能力
    cout << "超人的身体:" << sm->getBody() << endl;
    cout << "超人的特殊能力:" << sm->getSpecialTalent() << endl;
    cout << "超人带的标志:" << sm->getSpecialSymbol() << endl;

    return 0;
};
/*输出结果
超人的身体:强壮的躯体
超人的特殊能力:会飞行
超人带的标志:胸前带S标记
*/

26.1.3 最佳实践

(1)意图不同

  ①工厂方法模式,关注的是一个产品整体无须关心产品各部分是如何创建出来的。

  ②建造者模式,一个具体产品的产生是依赖各个部件的产生以及装配顺序,它关注的是由零件一步一步地组装出产品对象

  ③简单理解,工厂模式是一个对象创建的粗线条应用,建造者模式则是通过细线程勾勒出一个复杂对象,关注的是产品组成部分的创建过程。

(2)产品的复杂度不同

  ①工厂方法模式创建的产品一般都是单一性质产品,都是一个模样

  ②建造者模式创建的则是一个复合产品,它则各个部件复合而成,部件不同,产品对象当然不同。

  ③一般来说工厂方法模式创建的产品的粒度比较粗,而建造者模式的产品对象粒度比较细。

(3)方法的选择:如果关注一个产品部件的生产、安装步骤,则选择建造者否则选择工厂方法模式

 

第26章 创建型模式大PK

标签:

原文地址:http://www.cnblogs.com/5iedu/p/5655196.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!