工厂方法入门


#include 


// 定义抽象交通工具的基类
// 产品的接口
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;
}
  • 对扩展开放,对修改关闭
  • 依赖倒置,避免依赖具体的类,尽量依赖抽象。可以尽量避免抽象。可以避免创建者和具体产品之间的紧密耦合。
  • 单一职责原则,将产品创建代码放在程序的单一位置,从而使得代码更易维护。

**缺点:**应用工厂方式模式需要引入许多新的子类,代码可能会因此编的更加复杂。最好的情况是将该模式引入创建者的现有层次结构中。

你可能感兴趣的:(软件编程,开发语言)