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

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

文章目录

      • 1. 情景与意图
      • 2. 简单工厂模式
      • 3. 实现手机工厂
      • 4. 工厂方法模式
      • 4. 工厂方法模式实现手机工厂
      • 5. 总结

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. 总结

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


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部