简单工厂模式
简述
简单工厂模式 又叫 静态工厂方法模式,属于创建型模式。简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类的实例。
模式结构

工厂: 整个模式的核心,负责实现创建所有实例的内部逻辑。
抽象产品:所有具体产品的父类,负责描述所有实例所共有的公共接口。
具体产品:最终创建的具体产品
优缺点
优点:
- 工厂类包含了必要的逻辑判断,根据指定的信息来创建对应的产品。客户端仅负责“消费”产品即可,实现了对象创建和使用的分离。
- 客户端无需关心具体产品如何创建与组织,仅需知道具体产品所对应的参数即可,可以在一定程度减少使用者的记忆量。
缺点:
- 由于工厂类集中了所有产品的创建逻辑(违反了高内聚责任分配原则),职责过重,一旦无法正常工作,整个系统都将受到影响。
- 一旦添加新产品就不得不修改工厂逻辑,在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护。
这些缺点在
C++工厂方法模式 中得到了一定的克服。
案例:
互联网行业有三巨头 BAT,汽车界也有三大豪门 BBA - 奔驰、宝马、奥迪。他们是驰名世界的汽车企业,也被认为是高档汽车生产的先导,最可怕的是均属于德国制造。奔驰优雅稳重、宝马操控感强、奥迪大气,更是官车的代表。。。“坐奔驰,开宝马”,足以说明一切。在国内,BBA 大受欢迎,对很多人来说,不仅是代步工具,更是身份的象征。
代码实现
/*头文件*/
#include <iostream>
enum CARTYPE
{
BEN_CHI = 0,
BAO_MA = 1,
AO_DI =2
};
//产品抽象类
class ICar
{
public:
virtual void carName() = 0;
};
/*源文件*/
#include "SimpleFactory.h"
//具体产品类
class BenzCar : public ICar
{
public:
virtual void carName() { std::cout << "Benz" << std::endl; }
};
class BaoMCar : public ICar
{
public:
virtual void carName() { std::cout << "BaoM" << std::endl; }
};
//工厂类
class Factory
{
public:
ICar* product(CARTYPE car)
{
ICar *ica = nullptr;
switch (car)
{
case BEN_CHI:
ica = new BenzCar();
break;
case BAO_MA:
ica = new BaoMCar();
break;
case AO_DI:
break;
default:
break;
}
return ica;
}
};
int main()
{
Factory *fctr = new Factory();
ICar *ica = fctr->product(BAO_MA);
ica->carName();
delete ica;
getchar();
return 0;
}
工厂方法
模式
简述
工厂方法模式 是一种常用的对象创建型设计模式,此模式的核心思想是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦,复用以及方便后期维护拓展的目的。
UML 结构图

抽象工厂:是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口
具体工厂:实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且被应用程序调用以创建产品对象。
抽象产品:所创建对象的基类,也就是具体产品的共同父类或共同拥有的接口。
具体产品:实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应
优缺点
优点:
- 克服了简单工厂模式违背开放-封闭原则的缺点,又保留了封装对象创建过程的优点,降低客户端和工厂的耦合性。所以说,“工厂方法模式”是“简单工厂模式”的进一步抽象和推广。
缺点:
- 每增加一个产品,相应的也要增加一个子工厂,加大了额外的开发量。
案例分析
工厂模式基本和简单工厂模式差不多,简单工厂模式 - 在产品子类添加时,需要添加一个判断分支,这违背了开放-封闭原则。因此,工厂模式就是为了解决这个问题而产生的。
/*头文件*/
#include <iostream>
enum CARTYPE
{
BEN_CHI = 0,
BAO_MA = 1,
AO_DI = 2
};
class ICar
{
public :
virtual void carName() = 0;
};
class Factory
{
public:
virtual ICar* product(CARTYPE carTyp) = 0;
};
/*源文件*/
#include "FactoryMethod.h"
class Benz : public ICar
{
public:
virtual void carName() { std::cout << "Benz" << std::endl; }
};
class BaoM : public ICar
{
public:
virtual void carName() { std::cout << "BaoM" << std::endl; }
};
class BenFacty : public Factory
{
virtual ICar* product(CARTYPE carType) { return new Benz(); }
};
class BaoFacty : public Factory
{
virtual ICar* product(CARTYPE carType) { return new BaoM(); }
};
int main()
{
Factory *ben = new BenFacty();
ICar *benCar = ben->product(BEN_CHI);
benCar->carName();
delete benCar;
delete ben;
getchar();
return 0;
}