设计模式之工厂模式

一、工厂模式概述

工厂生产产品、产量大、质量保证、在程序中生产某一类对象,不用担心生产对象有问题,只要工厂类没有问题,可以生产很多种对象、但是必须是兄弟关系、都继承一个父类。

二、简单工厂模式

简单工厂模式创建步骤:

  • 创建一个新的类,可以称之为工厂类,对于简单工厂模式来说,需要的工厂类只有一个。
  • 在这个工厂类里面添加一个公共成员函数,通过这个函数我们可以创建需要的对象,这个函数可以称之为工厂函数。
  • 关于使用,首先创建一个工厂类的对象,通过这个对象调用工厂函数,这样就可以生产出指定类型的实例对象(兄弟关系)。

三、简单工厂模式代码及解释

cpp 复制代码
// 定义抽象汽车类
class AbstractCar
{
public:
	virtual void engine() = 0;  // 纯虚函数,定义发动机相关操作,子类需实现
	virtual void chassis() = 0; // 纯虚函数,定义底盘相关操作,子类需实现
	virtual ~AbstractCar() {}  // 虚析构函数,确保正确释放子类对象资源
};

// 轿车类,继承自抽象汽车类
class SedanCar : public AbstractCar
{
public:
	virtual void engine() override  // 重写父类的发动机操作
	{
		cout << "轿车->小型汽油发动机" << endl;
	}
	virtual void chassis() override  // 重写父类的底盘操作
	{
		cout << "轿车->轻型底盘" << endl;
	}
};

// SUV 类,继承自抽象汽车类
class SUVCar : public AbstractCar
{
public:
	virtual void engine() override  // 重写父类的发动机操作
	{
		cout << "SUV->大型汽油发动机" << endl;
	}
	virtual void chassis() override  // 重写父类的底盘操作
	{
		cout << "SUV->坚固底盘" << endl;
	}
};

// 卡车类,继承自抽象汽车类
class TruckCar : public AbstractCar
{
public:
	virtual void engine() override  // 重写父类的发动机操作
	{
		cout << "卡车->柴油发动机" << endl;
	}
	virtual void chassis() override  // 重写父类的底盘操作
	{
		cout << "卡车->重载底盘" << endl;
	}
};

enum class Type :char { SedanCar, SUVCar, TruckCar };  // 定义一个枚举类型,表示汽车类型

class CarFactor
{
public:
	AbstractCar * createCar(Type type)  // 根据给定的汽车类型创建相应的汽车对象
	{
		AbstractCar*ptr = nullptr;  // 初始化指针为空
		switch (type)  // 根据传入的汽车类型进行选择
		{
		case Type::SedanCar:  // 如果是轿车类型
			ptr = new SedanCar;  // 创建轿车对象
			break;
		case Type::SUVCar:  // 如果是 SUV 类型
			ptr = new SUVCar;  // 创建 SUV 对象
			break;
		case Type::TruckCar:  // 如果是卡车类型
			ptr = new TruckCar;  // 创建卡车对象
			break;
		}
		return ptr;  // 返回创建的汽车对象指针
	}
};

int main()
{
	CarFactor*factory = new CarFactor;  // 创建汽车工厂对象
	AbstractCar*obj = factory->createCar(Type::SedanCar);  // 创建轿车对象
	obj->engine();  // 调用轿车的发动机操作
	obj->chassis();  // 调用轿车的底盘操作
	delete obj;  // 释放轿车对象内存
	delete factory;  // 释放工厂对象内存
	return 0;
}

大致思路:在产品类的父类中定义一些接口也就是虚函数,定义为纯虚函数子类必须要重写这个方法,给父类提供一个虚析构函数,多态避免内存泄漏,再定义几个子类继承父类,创建一个工厂类,创建公共成员函数,参数定义枚举可以进行错误检查,工厂函数内部通过switch进行判断,用父类指针指向子类对象,主函数创建工厂类的对象,听过工厂对象调用工厂方法。简单工厂模式其实是对多态的一个应用。

简单工厂模式缺点:已经开发好的不能进行修改如果只有一个工厂函数那可定会修改、工厂函数内部代码量太多不容易被维护、可读性随着代码增越来越低。

四、工厂模式

工厂模式是对简单工厂的解耦、一对一的关系创建n个工厂类、削弱了工厂类的功能尽可能让工厂类的功能单一、遵循单一原则。遵循设计模式三原则、增加新的可以直接添加子工厂类不需要修改。

工厂模式对简单工厂的解耦合

在简单工厂模式中,工厂类通常包含了创建所有产品对象的逻辑,这导致工厂类的职责过于复杂和庞大。而工厂模式通过将每个产品的创建逻辑分离到各自对应的工厂类中,实现了工厂类与产品类之间的解耦合。

例如,在汽车制造的例子中,简单工厂可能在一个类中处理轿车、SUV 和卡车的创建,而工厂模式则为轿车、SUV 和卡车分别创建独立的工厂类。

一对一的关系创建 n 个工厂类

每个具体的产品都有一个对应的工厂类,建立了明确的一对一映射关系。这种明确的关系使得系统的结构更加清晰和易于理解。

比如,有轿车产品就有轿车工厂类,有 SUV 产品就有 SUV 工厂类,不会出现一个工厂类负责多种差异较大的产品创建。

削弱工厂类的功能,让其功能单一

每个工厂类只专注于创建一种特定类型的产品,功能变得单一而明确。这符合单一职责原则,即一个类应该只有一个引起它变化的原因。

以汽车工厂为例,轿车工厂只关心如何创建轿车,不需要了解 SUV 或卡车的创建细节,降低了工厂类内部的复杂性。

五、工厂模式代码及解释

cpp 复制代码
// 定义抽象汽车类
class AbstractCar
{
public:
	virtual void engine() = 0;  // 发动机
	virtual void chassis() = 0; // 底盘
	virtual ~AbstractCar() {}
};

// 轿车类,继承自抽象汽车类
class SedanCar : public AbstractCar
{
public:
	virtual void engine() override
	{
		cout << "轿车->小型汽油发动机" << endl;
	}
	virtual void chassis() override
	{
		cout << "轿车->轻型底盘" << endl;
	}
};

// SUV 类,继承自抽象汽车类
class SUVCar : public AbstractCar
{
public:
	virtual void engine() override
	{
		cout << "SUV->大型汽油发动机" << endl;
	}
	virtual void chassis() override
	{
		cout << "SUV->坚固底盘" << endl;
	}
};

// 卡车类,继承自抽象汽车类
class TruckCar : public AbstractCar
{
public:
	virtual void engine() override
	{
		cout << "卡车->柴油发动机" << endl;
	}
	virtual void chassis() override
	{
		cout << "卡车->重载底盘" << endl;
	}
};

// 定义工厂类(父类)
class CarFactory
{
public:
	virtual AbstractCar* createCar() = 0;
	virtual ~CarFactory() {}
};

// 轿车工厂类,继承自工厂类
class SedanCarFactory : public CarFactory
{
public:
	AbstractCar* createCar()
	{
		return new SedanCar;
	}
	~SedanCarFactory()
	{
		cout << "SedanCarFactory 被析构掉了" << endl;
	}
};

// SUV 工厂类,继承自工厂类
class SUVCarFactory : public CarFactory
{
public:
	AbstractCar* createCar()
	{
		return new SUVCar;
	}
	~SUVCarFactory()
	{
		cout << "SUVCarFactory 被析构掉了" << endl;
	}
};

// 卡车工厂类,继承自工厂类
class TruckCarFactory : public CarFactory
{
public:
	AbstractCar* createCar()
	{
		return new TruckCar;
	}
	~TruckCarFactory()
	{
		cout << "TruckCarFactory 被析构掉了" << endl;
	}
};

int main()
{
	CarFactory* factory = new SedanCarFactory;
	AbstractCar* obj = factory->createCar();
	obj->engine();
	obj->chassis();
	delete obj;
	delete factory;
	return 0;
}

总的来说,工厂模式通过解耦合、功能单一化和遵循设计原则,使得软件系统在面对产品种类的变化和扩展时,能够更加灵活、易于维护和扩展,减少了因为修改现有代码而引入新错误的风险。

本篇文章主要通过制造汽车这个场景介绍了简单工厂模式工厂模式,希望您可以对工厂模式有一个初步理解!看完点赞哟(爱心)!

相关推荐
闲人一枚(学习中)27 分钟前
设计模式-创建型-抽象工厂模式
设计模式·抽象工厂模式
小白不太白9503 小时前
设计模式之 观察者模式
观察者模式·设计模式
小白不太白9504 小时前
设计模式之 责任链模式
python·设计模式·责任链模式
吾与谁归in4 小时前
【C#设计模式(13)——代理模式(Proxy Pattern)】
设计模式·c#·代理模式
吾与谁归in4 小时前
【C#设计模式(14)——责任链模式( Chain-of-responsibility Pattern)】
设计模式·c#·责任链模式
闲人一枚(学习中)5 小时前
设计模式-创建型-原型模式
设计模式
Iced_Sheep5 小时前
干掉 if else 之策略模式
后端·设计模式
哪 吒12 小时前
最简单的设计模式,抽象工厂模式,是否属于过度设计?
设计模式·抽象工厂模式
Theodore_102212 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
转世成为计算机大神15 小时前
易考八股文之Java中的设计模式?
java·开发语言·设计模式