飞道的博客

C++实现简单工厂模式与工厂方法模式

227人阅读  评论(0)

后面介绍的几种设计模式同属一种类型。由于简单工厂和工厂方法简单和类似,因此先来介绍

1. 简单工厂模式

  定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
  简单的说就是绕开通过new的这种方式,隐藏创建细节。通过接口来创建对象。

2. 实现手机工厂

  当前手机市场有众多品牌手机,消费者只在意拿到手机,而不会去在乎一台手机是怎么被生产出来的。直接用代码来呈现出来吧。

// 首先定义一个抽象的手机类型:
class DPPhone {
   
public:
	virtual void messageFunction() = 0;
	virtual void wechatFunction() = 0;
	virtual void baiduFunction() = 0;
	virtual void douyinFunction() = 0;
	
	// 由于本身和子类在本次不新增成员实例,因此不添加虚析构
};

// 接下来具体几种品牌手机:OPPO,华为小米
class DPOppoPhone : public DPPhone {
   
	void baiduFunction();
	void wechatFunction();
	void messageFunction();
	void douyinFunction();
};
class DPHuaWeiPhone : public DPPhone {
   
	void baiduFunction();
	void wechatFunction();
	void messageFunction();
	void douyinFunction();
};
class DPMiPhone : public DPPhone{
   
	void baiduFunction();
	void wechatFunction();
	void messageFunction();
	void douyinFunction();
};

下面就是工厂,通过工厂来拿到手机,手机工厂提供一个提供手机的接口:

// 可以定义一个枚举来描述品牌
enum class DPPhoneBrand {
   
	DPPhoneBrandMi,
	DPPhoneBrandHuaWei,
	DPPhoneBrandOppo
};
// 实现一个工厂类并提供一个类方法获得手机
class DPPhoneFactory {
   
public:
	static DPPhone* getPhoneWithBrand(DPPhoneBrand brand);
};

具体我们来使用一下:

int main() {
   
	// 这里就不再使用new来创建对象,而是直接通过工厂来拿到手机对象
	DPPhone* miPhone = DPPhoneFactory::getPhoneWithBrand(DPPhoneBrand::DPPhoneBrandMi);
	if (miPhone) {
   
		miPhone->messageFunction();
	}
	DPPhone* hwPhone = DPPhoneFactory::getPhoneWithBrand(DPPhoneBrand::DPPhoneBrandHuaWei);
	if (hwPhone) {
   
		hwPhone->wechatFunction();
	}
	return 0;
}

简单工厂模式源代码见链接【仓库地址】

3. 工厂方法模式

  工厂方法模式其实就是将简单工厂模式进行改进。见上面我们使用的时候,是通过传入品牌参数,然后拿到手机。这样做会带来一些问题,

  • 就是用户在使用的时候传入错误的参数,比如传入了不在DPPhoneBrand中的枚举值。
  • 当我们需要加入其他的品牌手机的时候,需要重新更改工厂类。这就违反了开闭原则

工厂方法模式就是防止上述情况的发生。

4. 工厂方法模式实现手机工厂

手机抽象类和手机具体的类我们不改变。我们将工厂类抽象出来:

class DPAbstractPhoneFactory {
   
public:
	virtual DPPhone* getPhone() = 0; 
	// 类太多了,不写虚析构了   !=_=
};

然后我们实现三个手机工厂

class DPHuaWeiPhoneFactory : public DPAbstractPhoneFactory{
   
public:
	virtual DPPhone* getPhone();
};

class DPMiPhoneFactory : public DPAbstractPhoneFactory {
   
public:
	virtual DPPhone* getPhone();
};

class DPOppoPhoneFactory : public DPAbstractPhoneFactory {
   
public:
	virtual DPPhone* getPhone();
};

下面来看看使用的区别

int main() {
   
	// 简化了一下
	DPPhone* huaweiPhone = DPHuaWeiPhoneFactory().getPhone(); 
	huaweiPhone->baiduFunction();
	return 0;
}

后面要新增手机品牌只用使用新增类,而不用修改之前的代码,符合开闭原则。且不用担心因为参数错误问题。
图解如下:

5. 总结

  工厂模式用于隔离类对象的使用者和具体类型之间的耦合关系。屏蔽产品的具体实现,调用者只关心产品的接口。其确定也很明显,每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。
简单工厂模式代码:【仓库地址】
工厂方法模式代码:【仓库地址】


转载:https://blog.csdn.net/Void_leng/article/details/115797848
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场