后面介绍的几种设计模式同属一种类型。由于简单工厂和工厂方法简单和类似,因此先来介绍
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
查看评论