【C++ 设计模式 工厂模式对比】深入探索设计模式:工厂方法与抽象工厂的比较与对照

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 【C++ 设计模式 工厂模式对比】深入探索设计模式:工厂方法与抽象工厂的比较与对照

1. 引言

1.1 设计模式的重要性

设计模式(Design Patterns)是一种被广泛接受的,经过反复实践验证的,可复用的软件设计解决方案。它具有非常高的实用性和广泛的适用性。设计模式可以帮助我们高效地处理常见的,反复出现的设计问题,从而提高软件开发的效率和质量。

设计模式的使用也有助于提高代码的可读性和可维护性。当我们遵循某种已经被广泛接受的设计模式编写代码时,其他的开发者能够更轻松地理解我们的设计思想和代码逻辑。这是因为设计模式本质上是一种通用的语言,它提供了一种共享的理解框架。

设计模式的重要性可以从心理学家亚伯拉罕·马斯洛(Abraham Maslow)的名言中得到启示:“如果你只有一把锤子,你会看待世界就像一颗钉子。”设计模式就像工具箱中的各种工具,它们能帮助我们以不同的方式看待和解决问题。

1.2 工厂方法和抽象工厂概述

在设计模式中,工厂方法(Factory Method)和抽象工厂(Abstract Factory)都属于创建型模式。这两种模式的主要目的都是提供一个接口来创建对象,而无需指定具体的类或方法。这样,我们就可以在不改变代码的情况下,动态地更改实际创建的对象类型。

工厂方法模式(Factory Method)可以被看作是一个构造函数的泛化。在这种模式中,我们定义一个接口来创建对象,但让子类决定实例化哪个类。工厂方法让类的实例化推迟到子类。

抽象工厂模式(Abstract Factory)提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。抽象工厂通常依赖于工厂方法,但可以被覆盖以返回一个类的实例或一组相关的类的实例。

让我们以编写一个游戏的例子来更具体地说明。假设我们正在编写一个策略游戏,游戏中有两个不同的种族:人类(Human)和兽人(Orc)。每个种族都有自己的建筑,例如兵营(Barrack)和城堡(Castle)。使用抽象工厂,我们可以创建一个接口,例如 AbstractRaceFactory,它有两个方法:createBarrackcreateCastle。然后,我们可以有两个具体的工厂实现这个接口:HumanFactoryOrcFactory。这样,无论我们想创建人类的兵营还是兽人的城堡,都可以通过相应的工厂来实现,而不需要改变游戏的主代码。

2. 工厂方法模式

2.1 工厂方法模式的职责

工厂方法模式(Factory Method Pattern)的职责是提供一个用于创建对象的接口,将对象的实例化(实例化,Instantiation)推迟到子类进行。

这个模式可以解决直接实例化对象(直接使用new关键字)带来的问题。例如,如果我们直接实例化对象,那么代码将会对特定的类产生依赖,这使得代码变得不够灵活,不易于维护和扩展。

通过工厂方法模式,我们可以实现“依赖倒置原则”(Dependence Inversion Principle, DIP),也就是依赖于抽象而不是依赖于具体。这样,我们的代码就可以在不改变的情况下,适应新的需求或变化。

2.2 工厂方法模式的结构

工厂方法模式的结构主要包括以下三个部分:

  1. 抽象工厂(Abstract Creator):这是一个接口,它定义了一个创建产品对象的工厂方法。具体的工厂类需要实现这个接口。
  2. 具体工厂(Concrete Creator):这是实现了抽象工厂接口的类。它负责实例化具体的产品。
  3. 产品(Product):这是工厂方法模式创建的对象。

下面是一个简单的C++示例:

// 抽象工厂
class Creator {
public:
    virtual Product* CreateProduct() = 0;
};
// 具体工厂
class ConcreteCreator : public Creator {
public:
    Product* CreateProduct() override {
        return new ConcreteProduct();
    }
};
// 产品
class Product {
public:
    virtual void Show() = 0;
};
// 具体产品
class ConcreteProduct : public Product {
public:
    void Show() override {
        std::cout << "Concrete Product" << std::endl;
    }
};

2.3 工厂方法模式的实现方式

工厂方法模式的实现关键在于将对象的创建过程封装在工厂方法中。在C++中,我们可以通过定义一个返回产品对象的抽象方法来实现这一点。然后,具体的工厂类实现这个方法,返回具体的产品对象。

这样,我们的代码就不再依赖于具体的产品类。而是依赖于抽象的工厂接口和产品接口,这让代码具有更好的灵活性和可扩展性。

2.4 工厂方法模式的目的

工厂方法模式的主要目的是提供一种创建对象的机制,这种机制可以让我们的代码更加灵活,更易于扩展和维护。通过工厂方法模式,我们可以在不修改原有代码的情况下,引入新的产品类。

例如,假设我们正在开发一个图形编辑器,我们需要创建各种不同类型的图形对象,如圆形、矩形等。如果我们直接使用new关键字创建对象,那么我们的代码就会依赖于具体的图形类。当我们需要添加新的图形类型时,我们需要修改原有的代码。但是,如果我们使用工厂方法模式,那么我们就可以通过添加新的工厂类来添加新的图形类型,而无需修改原有的代码。

2.5 工厂方法模式的应用场景

工厂方法模式在以下几种情况下特别有用:

  1. 当一个类无法预见它需要创建哪种类的对象时。
  2. 当一个类希望由它的子类来指定它创建的对象时。
  3. 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化时。

例如,假设我们正在开发一个日志库,这个库需要支持多种日志记录方式,如文件记录、数据库记录、网络记录等。我们可以定义一个LoggerFactory接口和一个Logger接口。然后,对于每种日志记录方式,我们实现一个具体的LoggerFactoryLogger。使用工厂方法模式,我们的代码就可以在运行时动态地改变日志记录方式,而无需修改原有的代码。我们只需要添加一个新的LoggerFactoryLogger,就可以支持一种新的日志记录方式。

下面是一个简单的C++示例:

// 抽象工厂
class LoggerFactory {
public:
    virtual Logger* CreateLogger() = 0;
};
// 具体工厂
class FileLoggerFactory : public LoggerFactory {
public:
    Logger* CreateLogger() override {
        return new FileLogger();
    }
};
// 抽象产品
class Logger {
public:
    virtual void WriteLog() = 0;
};
// 具体产品
class FileLogger : public Logger {
public:
    void WriteLog() override {
        std::cout << "Write log to file." << std::endl;
    }
};

在这个例子中,如果我们需要支持数据库日志记录,我们只需要添加一个DatabaseLoggerFactory和一个DatabaseLogger,然后在运行时使用DatabaseLoggerFactory创建Logger,就可以实现数据库日志记录。

3. 抽象工厂模式

3.1 抽象工厂模式的职责

抽象工厂模式(Abstract Factory Pattern)的职责是提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定具体类。这个模式允许客户端使用抽象的接口来创建一组对象,这组对象有共同的主题,而不需要知道或关心实际创建的具体类是什么。

3.2 抽象工厂模式的结构

抽象工厂模式的结构主要包括以下四个部分:

  1. 抽象工厂(Abstract Factory):这是一个接口,它定义了创建一系列产品对象的方法。具体的工厂类需要实现这个接口。
  2. 具体工厂(Concrete Factory):这是实现了抽象工厂接口的类。它负责实例化具体的产品。
  3. 抽象产品(Abstract Product):这是一系列产品对象的共同接口。
  4. 具体产品(Concrete Product):这是工厂创建的对象,它们都实现了抽象产品接口。

下面是一个简单的C++示例:

// 抽象工厂
class AbstractFactory {
public:
    virtual AbstractProductA* CreateProductA() = 0;
    virtual AbstractProductB* CreateProductB() = 0;
};
// 具体工厂
class ConcreteFactory1 : public AbstractFactory {
public:
    AbstractProductA* CreateProductA() override {
        return new ProductA1();
    }
    AbstractProductB* CreateProductB() override {
        return new ProductB1();
    }
};
// 抽象产品
class AbstractProductA {
public:
    virtual void Use() = 0;
};
class AbstractProductB {
public:
    virtual void Use() = 0;
};
// 具体产品
class ProductA1 : public AbstractProductA {
public:
    void Use() override {
        std::cout << "Use Product A1" << std::endl;
    }
};
class ProductB1 : public AbstractProductB {
public:
    void Use() override {
        std::cout << "Use Product B1" << std::endl;
    }
};

3.3 抽象工厂模式的实现方式

抽象工厂模式的实现关键在于定义一个创建一系列产品对象的接口,然后由具体工厂来实现这个接口,创建具体的产品对象。

这样,我们的代码就不再依赖于具体的产品类。而是依赖于抽象的工厂接口和产品接口,这让代码具有更好的灵活性和可扩展性。

3.4 抽象工厂模式的目的

抽象工厂模式的主要目的是提供一种创建一系列相关或相互依赖的对象的机制,这种机制可以让我们的代码更加灵活,更易于扩展和维护。

例如,假设我们正在开发一个跨平台的UI库,我们需要创建各种不同类型的UI控件,如按钮、文本框等。我们希望,即使在不同的操作系统上,我们的代码都能运行。这时,我们可以使用抽象工厂模式来解决这个问题。

我们可以定义一个AbstractFactory接口,这个接口有CreateButtonCreateTextbox等方法。然后,对于每个操作系统,我们实现一个具体的AbstractFactory。在运行时,我们根据当前的操作系统,使用相应的AbstractFactory来创建UI控件。这样,我们的代码就可以在不同的操作系统上运行,而无需修改。

3.5 抽象工厂模式的应用场景

抽象工厂模式在以下几种情况下特别有用:

  1. 当一个系统应独立于它的产品如何被创建、组合和表示时。
  2. 当一个系统要由多个产品系列中的一个来配置时。
  3. 当要强调一系列相关的产品对象的设计以便进行联合使用时。
  4. 当你提供一个产品类库,而只想显示它们的接口而不是实现时。

例如,假设我们正在开发一个数据库访问库,这个库需要支持多种数据库,如MySQL、PostgreSQL、SQLite等。我们可以定义一个AbstractDatabaseFactory接口,这个接口有CreateConnectionCreateCommand等方法。然后,对于每种数据库,我们实现一个具体的AbstractDatabaseFactory。在运行时,我们根据当前的数据库配置,使用相应的AbstractDatabaseFactory来创建数据库访问对象。这样,我们的代码就可以在运行时动态地更改数据库,而无需修改原有的代码。

下面是一个简单的C++示例:

// 抽象工厂
class AbstractDatabaseFactory {
public:
    virtual Connection* CreateConnection() = 0;
    virtual Command* CreateCommand() = 0;
};
// 具体工厂
class MySQLDatabaseFactory : public AbstractDatabaseFactory {
public:
    Connection* CreateConnection() override {
        return new MySQLConnection();
    }
    Command* CreateCommand() override {
        return new MySQLCommand();
    }
};
// 抽象产品
class Connection {
public:
    virtual void Connect() = 0;
};
class Command {
public:
    virtual void Execute() = 0;
};
// 具体产品
class MySQLConnection : public Connection {
public:
    void Connect() override {
        std::cout << "Connect to MySQL." << std::endl;
    }
};
class MySQLCommand : public Command {
public:
    void Execute() override {
        std::cout << "Execute MySQL command." << std::endl;
    }
};

在这个例子中,如果我们需要支持PostgreSQL数据库,我们只需要添加一个PostgreSQLDatabaseFactory,然后在运行时使用PostgreSQLDatabaseFactory创建ConnectionCommand,就可以实现PostgreSQL数据库访问。

4. 工厂方法模式与抽象工厂模式的比较

4.1 职责上的差异

工厂方法模式(Factory Method)的职责是提供一个创建对象的接口,将具体的实例化过程推迟到子类进行。它主要用于创建一个产品对象。

抽象工厂模式(Abstract Factory)的职责是提供一个创建一系列相关或相互依赖对象的接口,而无需指定具体类。它主要用于创建一系列相关的产品对象。

4.2 结构上的差异

工厂方法模式中,每个具体工厂类只创建一种产品对象。而在抽象工厂模式中,每个具体工厂类可以创建多种类型的产品对象。

4.3 实现方式的差异

工厂方法模式中,具体工厂类实现了一个返回产品对象的方法。而在抽象工厂模式中,具体工厂类实现了返回一系列产品对象的方法。

4.4 目的的差异

工厂方法模式的主要目的是提供一种创建对象的机制,这种机制可以让我们的代码更加灵活,更易于扩展和维护。通过工厂方法模式,我们可以在不修改原有代码的情况下,引入新的产品类。

抽象工厂模式的主要目的是提供一种创建一系列相关或相互依赖的对象的机制,这种机制可以让我们的代码更加灵活,更易于扩展和维护。通过抽象工厂模式,我们可以在不修改原有代码的情况下,引入新的产品家族。

4.5 应用场景的差异

工厂方法模式适用于以下情况:

  1. 当一个类无法预见它需要创建哪种类的对象时。
  2. 当一个类希望由它的子类来指定它创建的对象时。
  3. 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化时。

抽象工厂模式适用于以下情况:

  1. 当一个系统应独立于它的产品如何被创建、组合和表示时。
  2. 当一个系统要由多个产品系列中的一个来配置时。
  3. 当要强调一系列相关的产品对象的设计以便进行联合使用时。
  4. 当你提供一个产品类库,而只想显示它们的接口而不是实现时。

总的来说,如果需要创建的对象是一个单一的产品,那么使用工厂方法模式可能更好。如果需要创建的对象是一系列相关或相互依赖的产品,那么使用抽象工厂模式可能更好。

4.6 适用原则的差异

在设计原则上,工厂方法模式和抽象工厂模式都遵循了“开闭原则”(Open-Closed Principle, OCP)——软件实体应当对扩展开放,对修改关闭。也就是说,添加新的产品类或产品家族时,我们只需要新增具体的工厂类和产品类,而无需修改原有的代码。

同时,这两种模式也都遵循了“依赖倒置原则”(Dependence Inversion Principle, DIP)——依赖于抽象而不依赖于具体。这意味着我们应该尽量使用接口或抽象类,而避免使用具体类。

然而,抽象工厂模式还遵循了一个额外的设计原则——“单一职责原则”(Single Responsibility Principle, SRP)。每个具体工厂类都只负责一个产品家族的创建,它不需要关心其他产品家族的创建。这样,我们就可以将代码的职责分离,使得每个类都只有一个变化的原因。

4.7 代码复杂性的差异

通常来说,抽象工厂模式的代码会比工厂方法模式的代码更复杂。这是因为抽象工厂模式需要定义更多的接口和类。特别是当产品家族中的产品数量增加时,抽象工厂模式的代码复杂性可能会急剧增加。

而工厂方法模式的代码则相对简单,因为它只需要定义一个创建产品的接口和实现这个接口的具体工厂类。

然而,尽管抽象工厂模式的代码比较复杂,但它提供了更高级的抽象,使得我们可以更方便地管理复杂的产品家族。因此,如果需要创建的对象是一系列相关或相互依赖的产品,那么使用抽象工厂模式可能是一个更好的选择。

4.8 适用场景的总结

这两种设计模式并不是互相替代的,而是各有各的适用场景:

  • 当你只需要创建一个具体的对象,而不需要关心这个对象属于哪个产品家族时,工厂方法模式是一个好的选择。
  • 当你需要创建一系列相关或相互依赖的对象,或者你想提供一个产品类库,只展示接口而不是实现时,抽象工厂模式会是一个更好的选择。

选择哪种模式主要取决于你的实际需求以及你希望如何组织你的代码。灵活性和可扩展性是我们在选择设计模式时需要考虑的重要因素。

5. 实例解析

为了进一步理解工厂方法模式和抽象工厂模式,我们将通过两个具体的实例来进行解析。

5.1 工厂方法模式的具体实例

假设我们正在开发一个日志库,这个库需要支持多种日志记录方式,如文件记录、数据库记录、网络记录等。我们可以使用工厂方法模式来实现。

首先,我们定义一个Logger接口,这个接口有一个WriteLog方法。然后,对于每种日志记录方式,我们实现一个Logger。例如,我们可以实现一个FileLogger,一个DatabaseLogger,一个NetworkLogger等。

接着,我们定义一个LoggerFactory接口,这个接口有一个CreateLogger方法。对于每种日志记录方式,我们实现一个LoggerFactory。例如,我们可以实现一个FileLoggerFactory,一个DatabaseLoggerFactory,一个NetworkLoggerFactory等。

在运行时,我们根据当前的配置,使用相应的LoggerFactory来创建Logger。这样,我们的代码就可以在运行时动态地改变日志记录方式,而无需修改原有的代码。

5.2 抽象工厂模式的具体实例

假设我们正在开发一个跨平台的UI库,我们需要创建各种不同类型的UI控件,如按钮、文本框等。我们希望,即使在不同的操作系统上,我们的代码都能运行。这时,我们可以使用抽象工厂模式来解决这个问题。

首先,我们定义一个Button接口和一个Textbox接口。然后,对于每种操作系统,我们实现一个Button和一个Textbox。例如,我们可以实现一个WindowsButton,一个MacButton,一个LinuxButton等。

接着,我们定义一个UIFactory接口,这个接口有一个CreateButton方法和一个CreateTextbox方法。对于每种操作系统,我们实现一个UIFactory。例如,我们可以实现一个WindowsUIFactory,一个MacUIFactory,一个LinuxUIFactory等。

在运行时,我们根据当前的操作系统,使用相应的UIFactory来创建ButtonTextbox。这样,我们的代码就可以在不同的操作系统上运行,而无需修改原有的代码。

通过这两个实例,我们可以看出工厂方法模式和抽象工厂模式的主要区别。工厂方法模式用于创建一个对象,而抽象工厂模式用于创建一系列相关的对象。这两种模式都可以提高代码的灵活性和可扩展性,让我们的代码更易于维护。

6. 总结

6.1 选择合适的设计模式的重要性

设计模式是解决软件设计中常见问题的通用、可重用的解决方案。它们可以使我们的代码更加清晰、更易于理解、更易于维护。然而,选择合适的设计模式是非常重要的。不同的设计模式有不同的适用场景,正确的选择可以使我们的代码更加高效,而错误的选择可能会导致代码更加复杂。

工厂方法模式和抽象工厂模式都属于创建型设计模式,它们都提供了一种创建对象的机制。工厂方法模式是一种创建单一产品的模式,它让创建过程延迟到子类进行。抽象工厂模式是一种创建产品家族的模式,它让创建过程延迟到具体工厂进行。

6.2 工厂方法模式与抽象工厂模式的适用场景回顾

选择使用工厂方法模式还是抽象工厂模式,主要取决于我们的需求:

  • 如果我们需要创建的对象是一个单一产品,并且我们希望使用子类来指定创建的对象,那么工厂方法模式可能是一个好的选择。
  • 如果我们需要创建的对象是一系列相关或相互依赖的产品,并且我们希望使用具体工厂来指定创建的对象,那么抽象工厂模式可能是一个更好的选择。

通过对工厂方法模式和抽象工厂模式的比较,我们可以看出设计模式的强大之处。它们不仅可以解决我们在软件设计中遇到的常见问题,而且可以帮助我们编写出更加清晰、更易于理解、更易于维护的代码。

结语

在我们的编程学习之旅中,理解是我们迈向更高层次的重要一步。然而,掌握新技能、新理念,始终需要时间和坚持。从心理学的角度看,学习往往伴随着不断的试错和调整,这就像是我们的大脑在逐渐优化其解决问题的“算法”。

这就是为什么当我们遇到错误,我们应该将其视为学习和进步的机会,而不仅仅是困扰。通过理解和解决这些问题,我们不仅可以修复当前的代码,更可以提升我们的编程能力,防止在未来的项目中犯相同的错误。

我鼓励大家积极参与进来,不断提升自己的编程技术。无论你是初学者还是有经验的开发者,我希望我的博客能对你的学习之路有所帮助。如果你觉得这篇文章有用,不妨点击收藏,或者留下你的评论分享你的见解和经验,也欢迎你对我博客的内容提出建议和问题。每一次的点赞、评论、分享和关注都是对我的最大支持,也是对我持续分享和创作的动力。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
19天前
|
设计模式 Java
【设计模式】工厂模式(定义 | 特点 | Demo入门讲解)
【设计模式】工厂模式(定义 | 特点 | Demo入门讲解)
28 2
|
1天前
|
设计模式 开发者 Python
Python编程中的设计模式:工厂方法模式###
本文深入浅出地探讨了Python编程中的一种重要设计模式——工厂方法模式。通过具体案例和代码示例,我们将了解工厂方法模式的定义、应用场景、实现步骤以及其优势与潜在缺点。无论你是Python新手还是有经验的开发者,都能从本文中获得关于如何在实际项目中有效应用工厂方法模式的启发。 ###
|
2月前
|
设计模式
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
这篇文章详细解释了工厂模式,包括简单工厂、工厂方法和抽象工厂三种类型。每种模式都通过代码示例展示了其应用场景和实现方法,并比较了它们之间的差异。简单工厂模式通过一个工厂类来创建各种产品;工厂方法模式通过定义一个创建对象的接口,由子类决定实例化哪个类;抽象工厂模式提供一个创建相关或依赖对象家族的接口,而不需要明确指定具体类。
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
|
2月前
|
设计模式 Java
Java设计模式-工厂方法模式(4)
Java设计模式-工厂方法模式(4)
|
3月前
|
设计模式 Java
Java 设计模式之谜:工厂模式与抽象工厂模式究竟隐藏着怎样的神奇力量?
【8月更文挑战第30天】在Java编程中,设计模式为常见问题提供了高效解决方案。工厂模式与抽象工厂模式是常用的对象创建型设计模式,能显著提升代码的灵活性、可维护性和可扩展性。工厂模式通过定义创建对象的接口让子类决定实例化哪个类;而抽象工厂模式则进一步提供了一个创建一系列相关或相互依赖对象的接口,无需指定具体类。这种方式使得系统更易于扩展和维护。
37 1
|
3月前
|
设计模式 算法 开发者
深入理解工厂模式与策略模式:设计模式的灵活应用
深入理解工厂模式与策略模式:设计模式的灵活应用
|
3月前
|
设计模式 XML 存储
【二】设计模式~~~创建型模式~~~工厂方法模式(Java)
文章详细介绍了工厂方法模式(Factory Method Pattern),这是一种创建型设计模式,用于将对象的创建过程委托给多个工厂子类中的某一个,以实现对象创建的封装和扩展性。文章通过日志记录器的实例,展示了工厂方法模式的结构、角色、时序图、代码实现、优点、缺点以及适用环境,并探讨了如何通过配置文件和Java反射机制实现工厂的动态创建。
【二】设计模式~~~创建型模式~~~工厂方法模式(Java)
|
3月前
|
设计模式 uml C语言
设计模式----------工厂模式之简单工厂模式(创建型)
这篇文章详细介绍了简单工厂模式,包括其定义、应用场景、UML类图、通用代码实现、运行结果、实际应用例子,以及如何通过反射机制实现对象创建,从而提高代码的扩展性和维护性。
设计模式----------工厂模式之简单工厂模式(创建型)
|
3月前
|
设计模式 uml
设计模式-------------工厂模式之工厂方法模式(创建型)
工厂方法模式是一种创建型设计模式,它通过定义一个用于创建对象的接口,让子类决定实例化哪一个类,从而实现类的实例化推迟到子类中进行,提高了系统的灵活性和可扩展性。
|
3月前
|
设计模式 Java C语言
设计模式-----------工厂模式之抽象工厂模式(创建型)
抽象工厂模式是一种创建型设计模式,它提供了一个接口用于创建一系列相关或相互依赖的对象,而无需指定具体类,从而增强了程序的可扩展性并确保客户端只使用同一产品族的产品。
设计模式-----------工厂模式之抽象工厂模式(创建型)