#include <iostream>// 定义抽象交通工具的基类
// 产品的接口
class Transport {
public:virtual~Transport() {}; // 虚的析构函数virtual void deliver() const = 0; // 纯虚函数
};// 定义卡车交通工具,继承交通工具
// 产品 A
class Truck :public Transport {
public:void deliver() const override // 继承过来的{std::cout << "卡车运输 ..." << std::endl;}};// 定义轮船交通工具,继承交通工具
// 产品 B
class Ship :public Transport {
public:void deliver() const override{std::cout << "轮船运输 ..." << std::endl;}
};// 物流公司
// 创造者
class Logistics
{
public:virtual ~Logistics() {}; // 虚的析构函数// 工厂方法的核心virtual Transport* factoryMethold() const = 0; // 物流公司创建工厂方法,基类void doSomething(){Transport* transport = factoryMethold();transport->deliver();delete transport; // 释放指针}
};// 卡车继承物流公司的工程方法,new Truck
// 具体的创造者 A
class TruckLogistics : public Logistics
{
public:virtual ~TruckLogistics() {}; // 虚的析构函数Transport* factoryMethold() const override{return new Truck();}
};// 轮船继承物流公司的工程方法,new Ship
// 具体的创造者 B
class ShipLogistics : public Logistics
{
public:virtual ~ShipLogistics() {}; // 虚的析构函数Transport* factoryMethold() const override{return new Ship();}};// 实现创建这就和产品松耦合
int main()
{Logistics* truckLogistics = new TruckLogistics();truckLogistics->doSomething();delete truckLogistics;Logistics* shipLogistics = new ShipLogistics();shipLogistics->doSomething();delete shipLogistics;return 0;
}
- 对扩展开放,对修改关闭
- 依赖倒置,避免依赖具体的类,尽量依赖抽象。可以尽量避免抽象。可以避免创建者和具体产品之间的紧密耦合。
- 单一职责原则,将产品创建代码放在程序的单一位置,从而使得代码更易维护。
**缺点:**应用工厂方式模式需要引入许多新的子类,代码可能会因此编的更加复杂。最好的情况是将该模式引入创建者的现有层次结构中。