通过例子学设计模式之--工厂方法模式以及使用场景说明(C++实现)
2017-10-16 16:07
861 查看
简单工厂模式有如下问题:
(1)工厂类职责不单一。比如设备类工厂,工厂一并生产USB,并口,串口,等等之类的设备,职责不单一,而且switch--case分支有可能比较多。
(2)违背开闭原则。比如设备类工厂,增加一个WIFI设备,则需要修改到工厂类的创建接口,可能会影响原有代码。
解决这2个问题,我们需要对工厂类进行抽象,抽象出创建的接口,通过多态的方法把创建延迟到子类实现,也就是工厂方法模式。
如下是类图对比(左边是简单工厂,右边是工厂方法)如下:
测试的代码和简单工厂方法类似:
class Device
{
public:
virtual void Write() = 0;
};
class USB : public Device
{
public:
void Write()
{
printf("USB::write...\r\n");
}
};
class COM : public Device
{
public:
void Write()
{
printf("COM::write...\r\n");
}
};
class LPT : public Device
{
public:
void Write()
{
printf("LPT::write...\r\n");
}
};
class DeviceFactory
{
public:
virtual Device *Create() = 0;
virtual void Destory(Device* dev)
{
if(dev)
{
delete dev;
dev = NULL;
}
}
};
class USBFactory : public DeviceFactory
{
public:
Device *Create()
{
return new USB;
}
};
class COMFactory : public DeviceFactory
{
public:
Device *Create()
{
return new COM;
}
};
class LPTFactory : public DeviceFactory
{
public:
Device *Create()
{
return new LPT;
}
};
void TestFactoryMethod()
{
DeviceFactory* usbF = new USBFactory;
Device* usb = usbF->Create();
usb->Write();
usbF->Destory(usb);
delete usbF;
usbF = NULL;
}
(1)工厂类职责不单一。比如设备类工厂,工厂一并生产USB,并口,串口,等等之类的设备,职责不单一,而且switch--case分支有可能比较多。
(2)违背开闭原则。比如设备类工厂,增加一个WIFI设备,则需要修改到工厂类的创建接口,可能会影响原有代码。
解决这2个问题,我们需要对工厂类进行抽象,抽象出创建的接口,通过多态的方法把创建延迟到子类实现,也就是工厂方法模式。
如下是类图对比(左边是简单工厂,右边是工厂方法)如下:
测试的代码和简单工厂方法类似:
class Device
{
public:
virtual void Write() = 0;
};
class USB : public Device
{
public:
void Write()
{
printf("USB::write...\r\n");
}
};
class COM : public Device
{
public:
void Write()
{
printf("COM::write...\r\n");
}
};
class LPT : public Device
{
public:
void Write()
{
printf("LPT::write...\r\n");
}
};
class DeviceFactory
{
public:
virtual Device *Create() = 0;
virtual void Destory(Device* dev)
{
if(dev)
{
delete dev;
dev = NULL;
}
}
};
class USBFactory : public DeviceFactory
{
public:
Device *Create()
{
return new USB;
}
};
class COMFactory : public DeviceFactory
{
public:
Device *Create()
{
return new COM;
}
};
class LPTFactory : public DeviceFactory
{
public:
Device *Create()
{
return new LPT;
}
};
void TestFactoryMethod()
{
DeviceFactory* usbF = new USBFactory;
Device* usb = usbF->Create();
usb->Write();
usbF->Destory(usb);
delete usbF;
usbF = NULL;
}
相关文章推荐
- 通过例子学设计模式之--桥接模式以及使用场景说明(C++实现)
- 通过例子学设计模式之--适配器模式以及使用场景说明(C++实现)
- 通过例子学设计模式之--原型模式以及使用场景说明(C++实现)
- 通过例子学设计模式之--外观模式以及使用场景说明(C++实现)
- 通过例子学设计模式之--简单工厂模式以及使用场景说明(C++实现)
- 通过例子学设计模式之--组合模式以及使用场景说明(C++实现)
- 通过例子学设计模式之--抽象工厂模式以及使用场景说明(C++实现)
- 通过例子学设计模式之--建造者模式以及使用场景说明(C++实现)
- 通过例子学设计模式之--单例模式以及多线程下说明(C++实现)
- 设计模式 工厂方法模式 C++实现
- 设计模式C++实现五:工厂方法模式
- 我所理解的设计模式(C++实现)——工厂方法模式(Factory Method Pattern)
- 《Head First 设计模式》例子的C++实现(1 策略模式)
- 我所理解的设计模式(C++实现)——工厂方法模式(Factory Method Pattern)
- 设计模式之工厂方法模式(C++实现)
- 使用设计模式中的单例模式来实现C++的boost库
- 设计模式之单例模式 c++实现以及详解
- 使用C++实现设计模式(连载): 第二回 Factory 工厂模式
- 设计模式C++实现(18)——工厂方法模式
- 设计模式之原型模式 c++实现以及详解