2023-6-10-第一式工厂方法模式

简介: 2023-6-10-第一式工厂方法模式

🎉一、基础概念

工厂方法模式(Factory Method Pattern)是一种常见的创建型设计模式,它通过定义一个用于创建对象的接口,让子类决定实例化哪个类。工厂方法模式使得一个类的实例化延迟到其子类。

在工厂方法模式中,通常包含以下几个角色:

  1. 抽象产品(Product):定义了产品的属性和方法。
  2. 具体产品(Concrete Product):实现抽象产品的具体属性和方法。
  3. 抽象工厂(Creator):定义用于创建产品的接口,包含一个抽象工厂方法。
  4. 具体工厂(Concrete Creator):实现抽象工厂接口,创建具体产品的实例对象。

以生产汽车为例,假设我们有两个品牌的汽车:奥迪和宝马。使用工厂方法模式可以这样实现:

  1. 定义一个抽象产品Car,包含属性和方法:brand, model, getBrand(), getModel()等。
  2. 定义两个具体产品:AudiCar和BMWCar,分别实现Car的属性和方法。
  3. 定义一个抽象工厂CarFactory,包含工厂方法createCar(),用于生产汽车对象。
  4. 分别定义AudiCarFactory和BMWCarFactory,实现CarFactory接口,重写createCar()方法,分别生产AudiCar和BMWCar的实例对象。

通过以上步骤,我们就可以使用工厂方法模式来生产奥迪和宝马两个品牌的汽车对象。在实际开发中,工厂方法模式常用于解耦对象的创建和使用,提高代码的可维护性和灵活性。


🎉二、工厂方法模式实现

在C++中,实现工厂方法模式可以分为以下几个步骤:

  1. 定义抽象产品类,声明产品的属性和方法:
class Product {
public:
    virtual void Show() = 0;
};
  1. 定义具体产品类,继承自抽象产品类,实现具体产品的属性和方法:
class ConcreteProductA : public Product {
public:
    void Show() { 
        std::cout << "This is ConcreteProductA!" << std::endl; 
    }
};
class ConcreteProductB : public Product {
public:
    void Show() { 
        std::cout << "This is ConcreteProductB!" << std::endl; 
    }
};
  1. 定义抽象工厂类,声明工厂方法createProduct(),用于创建产品对象:
class Factory {
public:
    virtual Product* createProduct() = 0;
};
  1. 定义具体工厂类,继承自抽象工厂类,重写工厂方法createProduct(),用于创建具体产品对象:
class ConcreteFactoryA : public Factory {
public:
    Product* createProduct() {
        return new ConcreteProductA();
    }
};
class ConcreteFactoryB : public Factory {
public:
    Product* createProduct() {
        return new ConcreteProductB();
    }
};
  1. 在客户端使用时,通过调用具体工厂的createProduct()方法创建具体产品对象:
int main() {
    Factory* factoryA = new ConcreteFactoryA();
    Product* productA = factoryA->createProduct();
    productA->Show();
    Factory* factoryB = new ConcreteFactoryB();
    Product* productB = factoryB->createProduct();
    productB->Show();
    delete productA;
    delete factoryA;
    delete productB;
    delete factoryB;
    return 0;
}

通过以上步骤,我们就可以在C++中实现工厂方法模式,达到将对象的创建和使用分离的目的,提高代码灵活性和可维护性。


🎉三、注意事项

在实现工厂方法模式时,需要注意以下几个问题:

  1. 抽象产品类和具体产品类的设计应该尽可能简单,遵循单一职责原则,不要包含过多的复杂逻辑。
  2. 工厂类的设计应该尽可能灵活,可以通过配置文件、参数等方式动态改变所创建的具体产品类。
  3. 注意工厂方法的返回值类型,通常应该使用基类指针或引用来接收具体产品对象,以保证代码的扩展性和可维护性。
  4. 在具体工厂中创建具体产品对象时,应该根据需要进行异常处理,比如判断是否成功分配内存、是否存在无效输入等情况。
  5. 合理使用智能指针,避免内存泄漏等问题。
  6. 工厂方法模式并不是万能的,需要根据具体情况选择合适的创建型模式。如果需要创建的对象较少且固定,可以考虑使用简单工厂模式如果需要创建的对象较多,且需要动态扩展,则可以使用工厂方法模式
  7. 最后,建议在程序正式运行前进行充分测试,确保代码的正确性和稳定性。

🎉四、补充-简单工厂模式

简单工厂模式(Simple Factory Pattern)是一种常见的创建型设计模式,它通过一个工厂类来实现对象的创建。简单工厂模式属于静态工厂模式,由一个工厂类根据传入的参数,动态决定创建哪一种产品类的实例

在简单工厂模式中,通常包含以下几个角色:

  1. 抽象产品类(Product):定义了产品的属性和方法。
  2. 具体产品类(Concrete Product):实现抽象产品的具体属性和方法。
  3. 工厂类(Factory):负责创建具体产品的实例对象,并提供一个静态方法用于创建对象。

以生产汽车为例,使用简单工厂模式可以这样实现:

  1. 定义一个抽象产品Car,包含属性和方法:brand, model, getBrand(), getModel()等。
  2. 定义两个具体产品:AudiCar和BMWCar,分别实现Car的属性和方法。
  3. 定义一个工厂类CarFactory,提供一个静态方法createCar(),用于根据输入参数创建对应的汽车对象:
class CarFactory {
public:
    static Car* createCar(string brand) {
        if (brand == "Audi") {
            return new AudiCar();
        } else if (brand == "BMW") {
            return new BMWCar();
        } else {
            return nullptr;
        }
    }
};
  1. 在客户端使用时,通过调用工厂类的静态方法createCar()创建具体产品对象:
int main() {
    Car* carA = CarFactory::createCar("Audi");
    if (carA != nullptr) {
        carA->Show();
        delete carA;
    }
    Car* carB = CarFactory::createCar("BMW");
    if (carB != nullptr) {
        carB->Show();
        delete carB;
    }
    return 0;
}

通过以上步骤,我们就可以使用简单工厂模式来生产奥迪和宝马两个品牌的汽车对象。在实际开发中,简单工厂模式常用于解耦对象的创建和使用,提高代码的可维护性和灵活性。


🎉五、补充-单一职责原则

单一职责原则(Single Responsibility Principle,SRP)是指一个类或模块应该有且只有一个单一的功能,并且该功能应该由这个类或模块完全封装起来。

简单来说,就是一个类或模块应该只负责一种职责,它所提供的所有服务都应该严密地支持这一职责。如果一个类或模块承担了多种职责,那么它就变得难以理解、维护和扩展

例如,在设计一个汽车类时,它应该只包含与汽车相关的属性和方法,比如品牌、型号、速度等,而不应该包含与其他领域无关的职责,比如计算机程序或图形界面等。如果一个类同时包含了多种职责,那么在使用和修改时就会非常困难,也容易引发错误和bug。

通过遵循单一职责原则,我们可以将系统中的行为划分为更小的、更具体的领域,从而使代码更加清晰、简洁和易于维护。同时,单一职责原则也有助于减少类之间的耦合度,提高代码的灵活性和可复用性。


🍳参考文献

🧊文章总结

提示:这里对文章进行总结:

  本文讲了关于工厂方法模式的实现和注意事项,比较简单。


目录
相关文章
|
存储 缓存 安全
10款轻量型的嵌入式GUI库分享
10款轻量型的嵌入式GUI库分享
2044 1
|
项目管理 Python
深入理解Python中的os.chdir()方法
`os.chdir()`是Python中用于改变当前工作目录的方法,简化文件和目录操作。语法为`os.chdir(path)`,`path`是目标目录路径。示例中展示了如何切换及检查工作目录。它常用于脚本执行、文件操作和多项目管理。注意目标目录必须存在,否则会抛出异常。相关方法有`os.getcwd()`获取当前目录和`os.path.join()`拼接路径。使用时结合异常处理可提升效率。参考[Python官方文档](https://docs.python.org/3/library/os.html)。
1317 3
|
存储 监控 数据可视化
科研效率神器!解锁6款协作工具的潜力
科研团队常面临任务分配、跨部门协作及数据管理的挑战。为此,推荐六款协作工具:板栗看板、Microsoft Project、Dropbox、ClickUp、Notion、Wrike。它们分别在任务可视化、资源分配、文件共享、多视图支持、模块化设计及任务依赖管理等方面表现出色,适用于不同类型和规模的科研项目。
413 1
科研效率神器!解锁6款协作工具的潜力
【算法优选】 动态规划之路径问题——贰
【算法优选】 动态规划之路径问题——贰
|
23天前
|
存储 DataWorks 数据挖掘
网页图表数据自动提取技术解析:从模拟滑动到数据流转的工程实践
本文介绍一种网页图表数据自动提取方案:通过模拟鼠标悬停,抓取ECharts等图表的浮窗数据,实现折线图、柱状图、饼图的结构化提取。支持RPA组件化调用,可输出至Excel、数据库或BI系统,并适配阿里云数据架构,助力企业打通数据分析“最后一公里”。
|
算法 编译器 开发者
CMake参数解析cmake_parse_arguments 的参数用法
CMake参数解析cmake_parse_arguments 的参数用法
552 2
|
数据采集 数据挖掘 数据处理
探索“数据菜谱”无限可能:首届Data-Juicer大模型数据竞赛
数据是LLaMA、Alpaca等大语言模型(LLM) 的“食物” ,你心中的大模型米其林菜单会是什么样呢?
|
算法 vr&ar Python
一文速学-时间序列分析算法之移动平均模型(MA)详解+Python实例代码
一文速学-时间序列分析算法之移动平均模型(MA)详解+Python实例代码
4125 0
一文速学-时间序列分析算法之移动平均模型(MA)详解+Python实例代码
蓝桥青少年组——计算24 2020-11-25
蓝桥青少年组——计算24 2020-11-25
251 0
|
easyexcel Java API
SpringBoot集成EasyExcel 3.x:高效实现Excel数据的优雅导入与导出
SpringBoot集成EasyExcel 3.x:高效实现Excel数据的优雅导入与导出
3155 1

热门文章

最新文章