#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;
}
- 对扩展开放,对修改关闭
- 依赖倒置,避免依赖具体的类,尽量依赖抽象。可以尽量避免抽象。可以避免创建者和具体产品之间的紧密耦合。
- 单一职责原则,将产品创建代码放在程序的单一位置,从而使得代码更易维护。
**缺点:**应用工厂方式模式需要引入许多新的子类,代码可能会因此编的更加复杂。最好的情况是将该模式引入创建者的现有层次结构中。