在做面向对象的软件开发时我们往往想达到更高的代码可复用性和更合理的软件颗粒度。
根据《设计模式——可复用面向对象软件的基础》所说:“你必须找到相关的对象,以适当的颗粒度将他们回归类,再定义类的接口和继承层次,建立对象之间的基本关系。你的设计应该对手头的问题有针对性,同时对将来的问题和需求也要有足够的通用性。”
内行的设计者知道:不是解决任何问题都要从头做起。他们更愿意复用以前使用的解决方案。这些重复的模式方案解决特定的问题,使得面向对象的设计更灵活、优雅,最终复用性更好。它们帮助设计者将新的设计建立在以往的工作基础上,复用以往的成功设计方案。一个熟悉这些设计模式的设计者不需要再去发现它们,而能够立即将他们应用于设计问题中。
本系列文章主要参考文献为——设计模式,可复用面向对象软件的基础(Design Patterns Elements of Reusable Object
文章目录
摘要
本章主要说明抽象工厂设计模式,该设计模式相对于简单工厂模式,工厂方法模式更为灵活。工厂方法模式和抽象工厂模式都包含抽象产品和抽象工厂,抽象工厂模式的区别在于,其抽象工厂对于对个抽象产品打包生产的特性,去掉该特性即是工厂方法模式。同样的,工厂方法模式去掉抽象工厂类转为实体类则是简单工厂模式,对于模式的学习可以通过比对的方式让自己对于类似相近模式有更深的理解。
具体实现代码
接下来我们通过一个实例代码来说明具体实现:
【例图】
/****************************************************************
Author : BingLee
Date : 2019-03-13
Info :
https://blog.csdn.net/Bing_Lee (C)All rights reserved.
******************************************************************/
#include <stdio.h>
#include <string>
//抽象引擎配件类
class Engine
{
public:
virtual void CreatEngine() = 0;
};
//具体引擎配件类
class BMW320Engine : public Engine
{
public:
BMW320Engine(){this->CreatEngine();}
void CreatEngine(){printf("creat BMW 320 Engine!\n");}
};
class BMW520Engine : public Engine
{
public:
BMW520Engine(){this->CreatEngine();}
void CreatEngine(){printf("creat BMW 520 Engine!\n");}
};
//抽象变速箱配件类
class GearBox
{
public:
virtual void CreatGearBox() = 0;
};
//具体变速箱配件类
class BMW320GearBox : public GearBox
{
public:
BMW320GearBox(){this->CreatGearBox();}
void CreatGearBox(){printf("creat BMW 320 GearBox!\n");}
};
class BMW520GearBox : public GearBox
{
public:
BMW520GearBox(){this->CreatGearBox();}
void CreatGearBox(){printf("creat BMW 520 GearBox!\n");}
};
//抽象工厂类
class AbstractFactory
{
public:
virtual Engine* CreatEngine() = 0;
virtual GearBox* CreatGearBox() = 0;
};
//具体BMW320工厂类
class BMW320Factory : public AbstractFactory
{
public:
BMW320Factory(){}
Engine* CreatEngine(){
return new BMW320Engine();
}
GearBox* CreatGearBox(){
return new BMW320GearBox();
}
};
//具体BMW520工厂类
class BMW520Factory : public AbstractFactory
{
public:
BMW520Factory(){}
Engine* CreatEngine(){
return new BMW520Engine();
}
GearBox* CreatGearBox(){
return new BMW520GearBox();
}
};
//客户端
#include <QCoreApplication>
#include "simplefactory.h"
#include "abstractfactory.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
AbstractFactory *factory320 = new BMW320Factory();
AbstractFactory *factory520 = new BMW520Factory();
//创建BMW320专属的Engine和Gearbox
Engine *engine320 = factory320->CreatEngine();
GearBox *gearbox320 = factory320->CreatGearBox();
//创建BMW520专属的Engine和Gearbox
Engine *engine520 = factory520->CreatEngine();
GearBox *gearbox520 = factory520->CreatGearBox();
return a.exec();
}
/*理论输出
creat BMW 320 Engine!
creat BMW 320 GearBox!
creat BMW 520 Engine!
creat BMW 520 GearBox!
*/
抽象工厂模式补充说明
其实这博客提到的三种工厂模式都非常的相似,都是为了实现将具体的产品与构造组合划分开来;不必为了追求更多的功能而使用相对难点的抽象工厂模式,最好的方法是根据需求来选用,如果简单工厂能实现现有需求及未来一段时间则采用这个模式,不能采用则采用其他模式。
抽象工厂模式关键在于对于归属于同一产品系列的配件做组合使用,这些配件可能分属于不用的抽象类,但在抽象工厂模式的具体工厂类中可以将他们做组合,正如BMW320Factory对 BMW320Engine 与 BMW320GearBox的组合实例化,这便是我认为抽象工厂的精髓。
如果需要专栏所有设计模式的源代码请留言留下你的联系方式,若能点赞、关注就更棒了!!!
本篇博客中的代码均已通过编译,如有Bug,请提出宝贵意见~