【有毒的设计模式】工厂方法模式

版权声明:O.O 欢迎转载,如果我有能力写到原创文章的话~ https://blog.csdn.net/qq_16468937/article/details/51039036

//说些废话

=。=,学会了简单工厂模式的话,这个就超级容易理解了,其实就是把大工厂分成N个小工厂的意思。


//部分资料来源

1.C++设计模式:http://www.jellythink.com/archives/62

2.程杰——大话设计模式


//适用场合:

1.在设计的初期,就考虑到产品在后期会进行扩展的情况下,可以使用工厂方法模式

2.产品结构较复杂的情况下,可以使用工厂方法模式


//正文




来看看代码吧,首先是一个生产食物的公司,下面有两个子公司,一个生产糖果,一个生产面包:

class FoodBussiness
{
public:
    virtual void create() = 0;
};

class SweetBussiness : public FoodBussiness
{
public:
    void create()
    {
        cout<<"Create Sweet"<<endl;
    }
};

class BreadBussiness : public FoodBussiness
{
public:
    void create()
    {
        cout<<"Create Bread"<<endl;
    }
};


然后看看工厂和子工厂,分别对应FoodBussiness、SweetBussiness、BreadBussiness


class Factory
{
public:
    virtual FoodBussiness *createFood() = 0;
};

class SweetFactory : public Factory
{
public:
    FoodBussiness *createFood()
    {
        return new SweetBussiness();
    }
};

class BreadFactory : public Factory
{
public:
    FoodBussiness *createFood()
    {
        return new BreadBussiness();
    }
};

然后看看主函数:

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    //生产糖果
    Factory *factory = new SweetFactory();
    FoodBussiness *food = factory->createFood();
    food->create();

    //生产面包
    Factory *factory2 = new BreadFactory();
    FoodBussiness *bread = factory2->createFood();
    bread->create();

    return a.exec();
}

简单说说几个点:


首先简单工厂和方法工厂的区别:

1.

简单工厂模式的优点在于:

(1)把逻辑判断都放在了工厂类里面,你需要实例化哪个类,就在工厂里面switch好了,然后直接返回得到对应的类,不用暴露那么多类给客户端。

(2)集中封装了对象的创建,降低了客户端与产品对象的耦合。

简单工厂模式的缺点在于:

(1)当我们要增加产品时,就要工厂类进行了修改,增加了case条件,这样就违反了开放-封闭原则了。这样大大影响了已经测试好的工厂类,增加了成本。



2.

工厂方法模式的优点在于:

(1)定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。[DP]

          也就是说,解决了简单工厂模式的缺点。

(2)保持了封装对象创建的优点

工厂方法模式的缺点在于:

(1)客户端需要决定实例化哪一个工厂来实现产品子类。选择判断问题依然存在,又要重新修改客户端了。


所以总体来说,这样改下来,是方便了以后增加产品子类的时候,不用去修改工厂类,而是增加工厂子类就可以了。但是又得让客户端进行内部逻辑判断了。

然后书上说抽象工厂模式就是解决这个问题的,然而我还没看到,以后再写。


//问题

1.

Q:所以说什么时候用这个模式??

A:你觉得你的类以后会继承出很多子类(或者说有很多功能可以override、拓展)的时候,那么也理应有很多对应创建他们的  工厂子类  ,这样就可以用工厂方法模式了。

       不过要注意一点,记得成产品类和工厂类两个类下, 重写一个产品方法  和  一个创建产品工厂方法  时,才用,不是见到几十个毫不相关的子类就用。


猜你喜欢

转载自blog.csdn.net/qq_16468937/article/details/51039036
今日推荐