//说些废话
=。=,学会了简单工厂模式的话,这个就超级容易理解了,其实就是把大工厂分成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、拓展)的时候,那么也理应有很多对应创建他们的 工厂子类 ,这样就可以用工厂方法模式了。
不过要注意一点,记得成产品类和工厂类两个类下, 重写一个产品方法 和 一个创建产品工厂方法 时,才用,不是见到几十个毫不相关的子类就用。