设计模式 C++简单工厂模式

Posted WhiteShirtI

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式 C++简单工厂模式相关的知识,希望对你有一定的参考价值。

在我们要使用一个对象时,就必须通过类来实例化对象,也就是需要new一个对象。在new的过程是非常复杂的,要经过读文件->解析文本->创建对象->给属性设值等过程。而引入工厂模式,就是将创建类的这个步骤又工厂来帮我们完成,我们只需要去使用工厂里创建好的类即可。在使用工厂时,我们需要让工厂知道我们想要的一个对象,所以我们可以通过传参的方式去告诉工厂我们的需求

定义思想:在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类

优点

  1. 实现了客户端和具体实现类的解耦
  2. 客户端免除了直接创建产品对象的责任,而仅仅“消费”产品产品
  3. 客户端无需知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可

缺点

  1. 想要增加新的产品类时需要修改源代码,不符合开闭原则
  2. 工厂类中集中了所有产品类的创建逻辑,如果这个类发生了问题。整个系统都要受到影响

适用场景

  1. 工厂类负责创建的对象比较少
  2. 客户端只知道传入工厂类的参数,对于如何创建对象不关心:

由于简单工厂模式不符合开闭原则,所以大佬将该模式从24种设计模式中移除

代码实现(手机产品)

首先创建一个抽象手机类,指定具体产品手机必须具有指定功能,也就是产品类必须要重写该类中的方法

//抽象手机
class AbstractPhone

public:
	virtual void ShowName() = 0;
;

具体产品的手机继承抽象手机类并对其方法进行重写

//华为
class Huawei : public AbstractPhone

public:
	virtual void ShowName()
	
		cout << "Huawe Phone" << endl;
	
;

//小米
class Xiaomi : public AbstractPhone

public:
	virtual void ShowName()
	
		cout << "Xiaomi Phone" << endl;
	
;

//苹果
class Apple : public AbstractPhone

public:
	virtual void ShowName()
	
		cout << "Apple Phone" << endl;
	
;

通过传入的参数来确定需要生成哪种手机

//手机工厂
class PhoneFactory

public:
	static AbstractPhone* CreatePhone(string name)
	
		if (name == "huawei")
			//...生产细节
			return new Huawei;
		else if (name == "xiaomi")
			//...生产细节
			return new Xiaomi;
		else if (name == "apple")
			//...生产细节
			return new Apple;
		else
			return nullptr;
	
;

测试:

void test()

	//创建工厂
	PhoneFactory* factor = new PhoneFactory;
	//创建手机
	AbstractPhone* phone;
	//指定工厂需要创建的手机
	phone = factor->CreatePhone("huawei");
	phone->ShowName();
	delete phone;

	phone = factor->CreatePhone("xiaomi");
	phone->ShowName();
	delete phone;

	phone = factor->CreatePhone("apple");
	phone->ShowName();
	delete phone;

	delete factor;

运行截图

推荐阅读设计模式 C++工厂方法模式

以上是关于设计模式 C++简单工厂模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式-简单工厂工厂方法模式抽象工厂模式详解

设计模式之工厂模式(C++)

设计模式之工厂模式(C++)

简单工厂模式

设计模式--简单工厂模式

简单工厂模式