什么是工厂模式?
和简单工厂模式区别不大,只是为工厂提供了一个抽象方法:c++ 设计模式 --- 单例模式、简单工厂_小雪菜本菜的博客-CSDN博客_c++单例工厂
工厂方法模式同样属于类的创建型模式又被称为多态工厂模式 。工厂方法模式的意义是 定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。 核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类 必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工 厂角色的情况下引进新的产品
为什么使用工厂模式
工厂方法模式与简单工厂模式在结构上的不同不是很明显。工厂方法类的核心是一个抽象工厂类,而简单工厂模式把核心放在一个具体类上。 工厂方法模式之所以有一个别名叫多态性工厂模式是因为具体工厂类都有共同的接口, 或者有共同的抽象父类。 当系统扩展需要添加新的产品对象时,仅仅需要添加一个具体对象以及一个具体工厂对 象,原有工厂对象不需要进行任何修改,也不需要修改客户端,很好的符合了“开放-封闭” 原则。而简单工厂模式在添加新产品对象后不得不修改工厂方法,扩展性不好。工厂方法模式退化后可以演变成简单工厂模式。
工厂模式实现步骤
1.提供一个抽象工厂类:所有具体工厂类的父类
2.提供与产品对应的工厂类:负责实例化产品对象
3.提供一个抽象产品类:所有产品的父类
4.提供一个或多个产品类:工厂方法模式所创建的具体实例对象
简单工厂的类图
抽象出一个抽象工厂,抽象工厂会有多个工厂,不同的工厂负责生产不同的产品,下面给出工厂模式的类图
工厂模式的交互由抽象工厂和抽象产品之间去完成的,实际的工厂类产生实际的产品
类图中有生产 A 产品的工厂、生产 B 产品的工厂、生产 C 产品的工厂,不同的工厂生产不同的产品
工厂模式实现代码
#include <iostream>
using namespace std;
//造火箭、造飞机是两个不同的事件 需要抽象一个火箭工厂和一个飞机工厂提供火箭和飞机
//抽象产品类
class AbstractProduct
{
public:
//存在父类指针和子类指针的操作 可以用虚析构函数
virtual ~AbstractProduct() {}
//虚函数创建产品
virtual void makeProduct() = 0;
};
//抽象工厂负责创建一个产品
class AbstractFactory
{
public:
virtual ~AbstractFactory() {}
virtual AbstractProduct* CreateProduct() = 0;
};
//针对抽象类写一个具体的实现类 <具体产品类>继承<抽象产品类>
//飞机
class PlaneProduct :public AbstractProduct
{
public:
//实现抽象产品类的纯虚函数即可
void makeProduct()
{
cout << "飞机......" << endl;
}
};
//飞机工厂
class PlaneFactory :public AbstractFactory
{
//实现纯虚方法即可
AbstractProduct* CreateProduct()
{
//飞机工厂负责创建飞机 直接返回
return new PlaneProduct;
}
};
//火箭
class RocketProduct :public AbstractProduct
{
public:
//实现抽象产品类的纯虚函数即可
void makeProduct()
{
cout << "火箭......" << endl;
}
};
//火箭工厂
class RocketFactory :public AbstractFactory
{
//实现纯虚方法即可
AbstractProduct* CreateProduct()
{
//火箭工厂负责创建火箭 直接返回
return new RocketProduct;
}
};
//也可以把整个过程封装成一个函数 由于是统一的行为所以可以统一接口
//传入一个工厂和一个产品
void test(AbstractFactory* factory,AbstractProduct* product)
{
//统一接口 只需要传入不同对象就可以了
factory->CreateProduct();
product->makeProduct();
}
int main()
{
//首先要有工厂 先 new 一个飞机工厂
AbstractFactory* factory = new PlaneFactory;
//有工厂就可以创建商品
AbstractProduct* product = factory->CreateProduct();
//输出产品信息
product->makeProduct();
//再 new 一个火箭工厂
factory = new RocketFactory;
product = factory->CreateProduct();
product->makeProduct();
return 0;
}
/* 输出 */
飞机......
火箭......
工厂模式优缺点
优点
-
需求改变时改动最小
-
具体的创建实例过程与客户端分离
缺点
-
新增功能时,工程量稍大(上面的例子,如果要添加新的工厂,代码比较累赘,需要添加两个类,如果要造轮船,需要写一个轮船产品的类和一个轮船工厂的类)