抽象工厂模式

来源:互联网 发布:是 什么是大数据概念 编辑:程序博客网 时间:2024/05/18 21:09

抽象工厂模式和工厂方法模式看上去十分像,其类图结构都一样,都是在一个基类中声明对象创建抽象接口,将实际的创建工作延迟到子类中去。但是他们的意图确是不一样的,同时他们的使用策略也不一样,我想这也是将他们作为不同模式的原因之一吧。

工厂方法模式使用继承的方式在其子类中实现了工厂方法,同时供子类中的其他成员函数调用创建对应的对象。而抽象工厂模式则是提供一组接口,创建对象家族。并以引用的形式,供其他类创建对象。这里确实让人感到很纠结,我们需要仔细思考一下他们的运用场景,也许这样才知道什么时候用什么样的工厂模式。

抽象工厂模式主要用于将一个产品家族的创建集成起来,而工厂方法往往用于创建一个产品,是客户端代码与实例化的具体类解耦。

就说这么多吧,来看看抽象工厂模式的类图:


这里只画了一个产品对象分支,其余的就难得画了,大家应该能看明白吧,有疑问留言交流生气

要写一个这个模式的例子,代码还不少,主要是设计的类比较多,毕竟咱们要实现一个创建产品家族的模式,类不多,怎么能称得上是一个产品家族呢?大笑

贴源码了:

#include <iostream>#include <string>using namespace std;//汽车车轮class CarWheel{public:CarWheel() : name("CarWheel"){}string name;};class BMWAmericaCarWheel : public CarWheel{public:BMWAmericaCarWheel(){name = "BMWAmericaCarWheel";}};class BenzAmericaCarWheel : public CarWheel{public:BenzAmericaCarWheel(){name = "BenzAmericaCarWheel";}};class BMWChinaCarWheel : public CarWheel{public:BMWChinaCarWheel(){name = "BMWChinaCarWheel";}};class BenzChinaCarWheel : public CarWheel{public:BenzChinaCarWheel(){name = "BenzChinaCarWheel";}};//汽车方向盘class CarCircle{public:CarCircle() : name("CarCircle"){}string name;};class BMWAmericaCarCircle : public CarCircle{public:BMWAmericaCarCircle(){name = "BMWAmericaCarCircle";}};class BenzAmericaCarCircle : public CarCircle{public:BenzAmericaCarCircle(){name = "BenzAmericaCarCircle";}};class BMWChinaCarCircle : public CarCircle{public:BMWChinaCarCircle(){name = "BMWChinaCarCircle";}};class BenzChinaCarCircle : public CarCircle{public:BenzChinaCarCircle(){name = "BenzChinaCarCircle";}};//汽车座椅class CarSeat{public:CarSeat() : name("CarSeat"){}string name;};class BMWAmericaCarSeat : public CarSeat{public:BMWAmericaCarSeat(){name = "BMWAmericaCarSeat";}};class BenzAmericaCarSeat : public CarSeat{public:BenzAmericaCarSeat(){name = "BenzAmericaCarSeat";}};class BMWChinaCarSeat : public CarSeat{public:BMWChinaCarSeat(){name = "BMWChinaCarSeat";}};class BenzChinaCarSeat : public CarSeat{public:BenzChinaCarSeat(){name = "BenzChinaCarSeat";}};//汽车配件工厂class CarPartFactory{public:virtual CarWheel* createWheel(string type) = 0;virtual CarCircle* createCircle(string type) = 0;virtual CarSeat* createSeat(string type) = 0;};class AmericaCarPartFactory : public CarPartFactory{CarWheel* createWheel(string type){CarWheel *carWheel = NULL;if (type == "BMWCarWheel"){carWheel = new BMWAmericaCarWheel;}else if (type == "BenzCarWheel"){carWheel = new BenzAmericaCarWheel;}return carWheel;}CarCircle* createCircle(string type){CarCircle *carCircle = NULL;if (type == "BMWCarCircle"){carCircle = new BMWAmericaCarCircle;}else if (type == "BenzCarCircle"){carCircle = new BenzAmericaCarCircle;}return carCircle;}CarSeat* createSeat(string type){CarSeat *carSeat = NULL;if (type == "BMWCarSeat"){carSeat = new BMWAmericaCarSeat;}else if (type == "BenzCarSeat"){carSeat = new BenzAmericaCarSeat;}return carSeat;}};class ChinaCarPartFactory : public CarPartFactory{CarWheel* createWheel(string type){CarWheel *carWheel = NULL;if (type == "BMWCarWheel"){carWheel = new BMWChinaCarWheel;}else if (type == "BenzCarWheel"){carWheel = new BenzChinaCarWheel;}return carWheel;}CarCircle* createCircle(string type){CarCircle *carCircle = NULL;if (type == "BMWCarCircle"){carCircle = new BMWChinaCarCircle;}else if (type == "BenzCarCircle"){carCircle = new BenzChinaCarCircle;}return carCircle;}CarSeat* createSeat(string type){CarSeat *carSeat = NULL;if (type == "BMWCarSeat"){carSeat = new BMWChinaCarSeat;}else if (type == "BenzCarSeat"){carSeat = new BenzChinaCarSeat;}return carSeat;}};//汽车组装(这里就简单实现了,比较本文主要将的是抽象工厂模式)//如果要实现不同类型汽车的创建,在汽车创建这一块可以采用工厂方法模式class CarProduct{public:CarProduct(CarPartFactory *carPartFactory){this->carPartFactory = carPartFactory;}~CarProduct(){delete carWheel;delete carCircle;delete carSeat;}void createCar(){carWheel = carPartFactory->createWheel("BMWCarWheel");carCircle = carPartFactory->createCircle("BMWCarCircle");carSeat = carPartFactory->createSeat("BMWCarSeat");cout << "生产汽车" << endl;cout << "使用的零件:" + carWheel->name + "、" + carCircle->name + "、" + carSeat->name << endl;}private:CarPartFactory *carPartFactory;CarWheel *carWheel;CarCircle *carCircle;CarSeat *carSeat;};void main(){int i = 0;CarPartFactory *americaCarPartFactory = new AmericaCarPartFactory;CarPartFactory *chinaCarPartFactory = new ChinaCarPartFactory;CarProduct *americaCarProduct = new CarProduct(americaCarPartFactory);CarProduct *chinaCarProduct = new CarProduct(chinaCarPartFactory);americaCarProduct->createCar();chinaCarProduct->createCar();delete americaCarPartFactory;delete chinaCarPartFactory;delete americaCarProduct;delete chinaCarProduct;cin >> i;}

这里大概解释一下源码:

这里主要以构建一辆汽车为例子,假设我们需要组装宝马和奔驰等各种类型汽车,那么首先我们得先有它的零件吧,不同国家生产的零件还是有区别的,正常情况下美国工厂比中国工厂生产的好大笑,所以我们需要针对不同的国家创建不同的零件生产工厂。既然生产出来的零件不一样,自然每一个零件针对不同国家都有对应的类(所以这里要创建的类就多了惊恐),当我们要组装汽车时,只需要将对应的工厂委托给汽车组装类,让委托的零件生产工厂类生产对应的零件进行组装即可。

感觉有点晕,本人水平有限,就只能讲到这种程度了,以后能力提升了,再来好好的理理思路。

原创粉丝点击