设计模式——简单工厂模式
- 什么是简单工厂模式
- 简单工厂模式的优点
我们今天接着来看设计模式的简单工厂模式,如果还没看过上一篇的单列模式的小伙伴可以点击这里:
https://blog.csdn.net/qq_67693066/article/details/136603292
什么是简单工厂模式
简单工厂模式(Simple Factory Pattern)是一种编程设计模式,属于创建型设计模式的范畴,它提供了一种集中管理和控制对象创建的方式,让客户端不必了解具体的创建逻辑。简单工厂模式的核心概念是一个“工厂类”,该类负责创建一系列相关或相互依赖的对象,而不是让客户端直接去new具体的对象。
在简单工厂模式中,客户端请求工厂对象来创建一个产品对象,而客户端并不关心具体产品的创建细节。例如,工厂可以根据传入的不同参数创建不同类型的对象,这些对象通常是具有共同接口或基类的一系列具体产品。
简单工厂模式的结构主要包括以下几个部分:
- 抽象产品(Abstract Product):定义了产品的接口或抽象类,它是所有具体产品类的公共父类或接口。
- 具体产品(Concrete Product):实现了抽象产品接口的具体产品类,每个具体产品对应工厂可能创建的一种产品对象。
- 工厂(Factory):负责创建具体产品的类,根据传入的参数来决定创建哪种具体产品对象。
简单工厂模式的一个主要优点是可以将对象的创建过程封装起来,简化客户端代码,隐藏实现细节;缺点是当需要添加新产品时,需要修改工厂类的代码,违反了开闭原则(Open/Closed Principle)。在实际应用中,当产品种类有限且扩展性需求不高时,简单工厂模式是一个实用的选择。
比如我们利用制作咖啡的例子来说明一下:
//pragma once 用于防止头文件被重复包含,确保头文件内容仅被编译一次
#pragma once// 引入必要的标准库头文件
#include<iostream> // 用于输出和输入操作
#include<cstring> // 提供字符串处理函数,此处可能并未直接使用,可以考虑是否真的需要
#include<memory> // 提供智能指针等内存管理工具,此处用于std::unique_ptr// 抽象产品类(咖啡接口)
class Coffee
{
public:// 声明纯虚函数,表示Coffee为抽象类,任何尝试实例化Coffee对象的行为都是非法的virtual std::string get_coffee_name() const = 0; // 获取咖啡名称的纯虚函数virtual double get_coffee_price() const = 0; // 获取咖啡价格的纯虚函数// 提供默认的析构函数,由于Coffee是抽象类,一般不需要提供特殊实现virtual ~Coffee() {} // 默认析构函数
};// 具体的产品(美国咖啡)
class AermicanCoffe : public Coffee
{
public:// 重写抽象基类Coffee的纯虚函数std::string get_coffee_name() const override{return "AermicanCoffe";}double get_coffee_price() const override{return 3.78;}
};// 具体的产品(中国咖啡)
class ChinaCoffe : public Coffee
{
public:// 重写抽象基类Coffee的纯虚函数std::string get_coffee_name() const override{return "ChinaCoffe";}double get_coffee_price() const override{return 3.98;}
};// 工厂类,用于根据传入的类型创建相应咖啡对象的智能指针
class CoffeeFactory
{
public:// 静态成员函数,创建并返回指向具体咖啡类型的唯一智能指针static std::unique_ptr<Coffee> createCoffee(const std::string& type){if(type == "AermicanCoffe"){// 创建并返回指向AermicanCoffe类型的智能指针return std::make_unique<AermicanCoffe>();}else if(type == "ChinaCoffe"){// 创建并返回指向ChinaCoffe类型的智能指针return std::make_unique<ChinaCoffe>();}else{// 输入的类型无效,输出错误信息,并返回空智能指针std::cout<<"Error type"<<std::endl;return nullptr;}}
};
在main函数中写到:
#include"Coffee.h"int main()
{auto coffee1 = CoffeeFactory::createCoffee("AermicanCoffe");std::cout << "Ordered coffee: " << coffee1->get_coffee_name()<< std::endl;std::cout << "Price: " << coffee1->get_coffee_price()<< std::endl;auto coffee2 = CoffeeFactory::createCoffee("ChinaCoffe");std::cout << "Ordered coffee: " << coffee2->get_coffee_name()<< std::endl;std::cout << "Price: " << coffee2->get_coffee_price()<< std::endl;return 0;
}
简单工厂模式的优点
简单工厂模式(Simple Factory Pattern)是一种创建型设计模式,它在软件设计中具有以下优点:
- 封装创建逻辑:简单工厂模式将对象的创建过程封装在一个工厂类中,客户端不需要知道具体的创建步骤和逻辑,只需传递必要的参数,就能得到想要的产品对象,降低了客户端与具体产品类的耦合度。
- 简化客户端代码:客户端只需调用工厂类的方法,不用关心创建对象的具体细节,简化了客户端代码,提高了代码的可读性和可维护性。
- 新增产品方便:如果要新增一种产品,只需新增一个产品类,并在工厂类中添加相应的创建逻辑,客户端代码基本无需修改,增强了系统的扩展性。
- 统一入口点:通过工厂类,可以控制哪些类可以被实例化,从而更容易控制全局的对象创建规则,例如实现单例模式或者限制特定环境下只能创建某种类型的产品。
- 便于切换实现:通过修改工厂类的内部逻辑,可以在不改变客户端代码的情况下切换产品的具体实现,提高了系统的灵活性。
比如我现在想增加一个泰国咖啡,我只需要在后面加就可以了:
修改一下工厂类:
然而,简单工厂模式也有一些局限性,例如它违反了开闭原则(Open/Closed Principle),每增加一个新的具体产品,就需要修改工厂类的代码,而且随着产品种类的增多,工厂类可能会变得庞大而难以维护。在大规模的系统设计中,可能需要考虑工厂方法模式或抽象工厂模式等更为灵活的设计方案。