通过例子学设计模式之--工厂方法模式以及使用场景说明(C++实现)

        简单工厂模式有如下问题:

        (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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值