【设计模式】 工厂模式介绍及C代码实现

简介: 工厂模式是一种创建型设计模式,它提供一种通用的接口来创建对象,但是让子类决定实例化哪个类。工厂模式将对象的创建过程封装在一个工厂类中,避免直接调用构造函数,提高代码的灵活性和可维护性。工厂模式实现了依赖倒置原则,即面向接口编程而不是面向实现编程。在工厂模式中,有一个抽象工厂接口,定义了工厂类应该实现的方法,以及一组产品接口,定义了工厂类应该创建的产品的通用行为。具体的工厂类实现了抽象工厂接口,用于创建具体的产品对象。工厂模式可以分为三种不同的类型:简单工厂模式、工厂方法模式和抽象工厂模式。

背景

  在软件系统中,经常面临着创建对象的工作;由于需求的变化,需要创建的对象的具体类型经常变化。 如何应对这种变化?如何绕过常规的对象创建方法(new),提供一种“封装机制”来避免客户程序和这种“具体对象创建工作”的紧耦合?

定义

  工厂模式是一种创建型设计模式,它提供一种通用的接口来创建对象,但是让子类决定实例化哪个类。工厂模式将对象的创建过程封装在一个工厂类中,避免直接调用构造函数,提高代码的灵活性和可维护性。工厂模式实现了依赖倒置原则,即面向接口编程而不是面向实现编程。

  在工厂模式中,有一个抽象工厂接口,定义了工厂类应该实现的方法,以及一组产品接口,定义了工厂类应该创建的产品的通用行为。具体的工厂类实现了抽象工厂接口,用于创建具体的产品对象。

  工厂模式可以分为三种不同的类型:简单工厂模式、工厂方法模式和抽象工厂模式。简单工厂模式只有一个工厂类,它根据传入的参数来决定创建哪种类型的产品对象。工厂方法模式定义一个抽象工厂接口和一组产品接口,每个具体的工厂类实现了抽象工厂接口,并创建了一组具体的产品对象。抽象工厂模式定义一组抽象工厂接口和一组抽象产品接口,每个具体的工厂类实现了一组抽象工厂接口,每个具体的产品类实现了一组抽象产品接口。

应用场景

工厂模式适用于以下场景:

  • 需要创建复杂对象的场景,可以使用工厂模式将对象的创建过程封装起来,避免直接调用构造函数;
  • 需要提供统一的接口来创建一组相关对象的场景,可以使用工厂模式将相关对象的创建过程统一起来;
  • 需要避免使用 new 关键字来创建对象的场景,可以使用工厂模式来代替直接调用构造函数。

  总的来说,工厂模式是一种非常常用的设计模式,可以提高代码的可维护性、灵活性和可扩展性,因此在各种编程语言中都得到了广泛的应用。

模式结构

在这里插入图片描述

实现步骤

工厂模式的实现步骤如下:

  1. 定义一个抽象产品接口,用于定义一组产品的通用行为。
  2. 定义一个具体产品类,实现抽象产品接口,用于提供具体的产品实现。
  3. 定义一个抽象工厂接口,用于定义工厂类应该实现的方法。
  4. 定义一个具体工厂类,实现抽象工厂接口,用于创建具体的产品对象。
  5. 在客户端代码中使用工厂类创建具体的产品对象。

C语言代码示例

下面是一个简单的 C 语言工厂模式的示例代码,用于创建不同类型的车辆对象:

#include <stdio.h>
#include <stdlib.h>

typedef enum {
    SEDAN,
    SUV,
    HATCHBACK
} CarType;

typedef struct {
    int price;
    char* model;
} Car;

Car* createCar(CarType type) {
    Car* car = (Car*) malloc(sizeof(Car));
    if (car == NULL) {
        return NULL;
    }

    switch (type) {
        case SEDAN:
            car->price = 20000;
            car->model = "Sedan Car";
            break;
        case SUV:
            car->price = 30000;
            car->model = "SUV Car";
            break;
        case HATCHBACK:
            car->price = 15000;
            car->model = "Hatchback Car";
            break;
        default:
            printf("Invalid car type.\n");
            free(car);
            return NULL;
    }

    return car;
}

int main() {
    Car* sedan = createCar(SEDAN);
    printf("Price of %s is %d.\n", sedan->model, sedan->price);
    free(sedan);

    Car* suv = createCar(SUV);
    printf("Price of %s is %d.\n", suv->model, suv->price);
    free(suv);

    Car* hatchback = createCar(HATCHBACK);
    printf("Price of %s is %d.\n", hatchback->model, hatchback->price);
    free(hatchback);

    Car* invalid = createCar(100);
    if (invalid == NULL) {
        printf("Failed to create invalid car.\n");
    }

    return 0;
}

  在上面的示例代码中,我们定义了一个 Car 结构体表示车辆,包含价格和型号两个属性,以及一个 CarType 枚举类型表示不同类型的车辆。
  createCar 函数是工厂函数,接受一个 CarType 参数,根据不同的类型创建不同的车辆对象,并返回指向 Car 结构体的指针。在 main 函数中,我们调用 createCar 函数创建不同类型的车辆对象,并输出其价格和型号。注意,当传入无效的 CarType 参数时,createCar 函数会返回 NULL。最后,我们需要手动释放 createCar 函数中使用 malloc 函数动态分配的内存。

总结

  使用工厂模式可以提高代码的可维护性和可扩展性。当需要新增产品时,只需要增加相应的产品类和工厂类,而无需修改客户端代码。当需要替换产品实现时,只需要修改相应的产品类和工厂类即可,而无需修改客户端代码。

  • 工厂设计模式用于隔离类对象的使用者和具体类型之间的耦合关系。面对一个经常变化的具体类型,紧耦合关系(new)会导致软件的脆弱。
  • 工厂设计模式通过面向对象的手法,将所要创建的具体对象工作延迟到子类,从而实现一种扩展(而非更改)的策略,较好地解决了这种紧耦合关系。
  • 工厂设计模式解决“单个对象”的需求变化。缺点在于要求创建方法/参数相同。

需要注意的是,过度使用工厂模式会增加代码的复杂性和额外的开销。因此,在实际使用时应该根据具体情况进行选择,选择最适合的实现方式。

目录
相关文章
|
4月前
|
设计模式 存储 Java
23种设计模式,备忘录模式的概念优缺点以及JAVA代码举例
【4月更文挑战第9天】备忘录模式是一种行为设计模式,它能在不破坏对象封装的前提下,捕获并保存对象的当前状态,以便后面可以恢复到这个状态。
60 0
|
13天前
|
设计模式 Java
重构你的代码:探索Java中的混合、装饰器与组合设计模式
【8月更文挑战第30天】在软件开发中,设计模式为特定问题提供了结构化的解决方案,使代码更易理解、维护及扩展。本文将介绍三种常用的 Java 设计模式:混合模式、装饰器模式与组合模式,并附有示例代码展示实际应用。混合模式允许通过继承多个接口或抽象类实现多重继承;装饰器模式可在不改变对象结构的情况下动态添加新功能;组合模式则通过树形结构表示部分-整体层次,确保客户端处理单个对象与组合对象时具有一致性。
11 1
|
24天前
|
设计模式 算法 安全
Java编程中的设计模式:提升代码的可维护性和扩展性
【8月更文挑战第19天】在软件开发的世界里,设计模式是解决常见问题的一种优雅方式。本文将深入探讨Java编程语言中常用的几种设计模式,并解释如何通过这些模式来提高代码的可维护性和扩展性。文章不涉及具体的代码实现,而是侧重于理论和实践相结合的方式,为读者提供一种思考和改善现有项目的新视角。
|
24天前
|
设计模式 Java
常用设计模式介绍~~~ Java实现 【概念+案例+代码】
文章提供了一份常用设计模式的全面介绍,包括创建型模式、结构型模式和行为型模式。每种设计模式都有详细的概念讲解、案例说明、代码实例以及运行截图。作者通过这些模式的介绍,旨在帮助读者更好地理解源码、编写更优雅的代码,并进行系统重构。同时,文章还提供了GitHub上的源码地址,方便读者直接访问和学习。
常用设计模式介绍~~~ Java实现 【概念+案例+代码】
|
11天前
|
前端开发 C# 设计模式
“深度剖析WPF开发中的设计模式应用:以MVVM为核心,手把手教你重构代码结构,实现软件工程的最佳实践与高效协作”
【8月更文挑战第31天】设计模式是在软件工程中解决常见问题的成熟方案。在WPF开发中,合理应用如MVC、MVVM及工厂模式等能显著提升代码质量和可维护性。本文通过具体案例,详细解析了这些模式的实际应用,特别是MVVM模式如何通过分离UI逻辑与业务逻辑,实现视图与模型的松耦合,从而优化代码结构并提高开发效率。通过示例代码展示了从模型定义、视图模型管理到视图展示的全过程,帮助读者更好地理解并应用这些模式。
27 0
|
22天前
|
设计模式 前端开发 算法
"揭秘前端开发的隐藏武器:掌握这些设计模式,让你的代码优雅升级!"
【8月更文挑战第21天】设计模式为前端开发提供了解决常见问题的模板,助力编写清晰、可维护的代码。本文概览了几种关键模式:模块模式通过立即执行函数表达式实现封装;单例模式确保全局唯一实例,适用于状态管理;工厂模式根据条件创建不同类型的对象;观察者模式建立对象间的依赖,便于事件处理和数据绑定;策略模式封装可互换的算法,提高灵活性。掌握这些模式能显著提升代码质量和开发效率。
26 0
|
1月前
|
设计模式 算法 数据库连接
PHP编程中的设计模式:提升代码的可维护性与扩展性
在软件开发的世界里,设计模式是解决常见问题的经典方法。对于PHP开发者而言,掌握这些模式不仅能够提高代码质量,还能让开发过程更加高效。本文将介绍几个关键的设计模式,并通过实例展示如何将这些理念应用到实际项目中去。
27 0
|
2月前
|
设计模式 存储 C#
|
2月前
|
设计模式 算法 C#
23种设计模式【C#代码举例】(上)
23种设计模式【C#代码举例】(上)
|
3月前
|
设计模式 Java
Java中设计模式及举例代码
Java中设计模式及举例代码
19 0