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

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

1. 情景与意图

  在某些编程语言中,针对对象的可变性进行了区分,比如string和mutablestring。而有的编程语言,我们使用的时候直接使用string,不用在乎是否有追加,删减等修改操作而创建另一个类。
  在在日常开发中,经常创建对象,但是由于需求的变化, 需要创建的对象的具体类型经常变化。
  是否能提供一 种“封装机制”来避免客户程序和这种具体类的紧耦合?——工程模式

2. 简单工厂模式

  定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
  简单的说就是绕开通过new的这种方式,隐藏创建细节。通过接口来创建对象。因为用new创建对象,就需要使用具体类,这样就带来了紧耦合的问题

3. 实现手机工厂

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

// 首先定义一个抽象的手机类型:
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;
}

4. 工厂方法模式

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

  • 就是用户在使用的时候传入错误的参数,比如传入了不在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. 总结

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值