网站建设和服务器运营,湘潭网站建设开发,福建企业年报网上申报入口,网站开发需要的资料【设计模式】 工厂模式介绍及C代码实现
背景 在软件系统中#xff0c;经常面临着创建对象的工作#xff1b;由于需求的变化#xff0c;需要创建的对象的具体类型经常变化。 如何应对这种变化#xff1f;如何绕过常规的对象创建方法(new)#xff0c;提供一种“封装机制”来…【设计模式】 工厂模式介绍及C代码实现
背景 在软件系统中经常面临着创建对象的工作由于需求的变化需要创建的对象的具体类型经常变化。 如何应对这种变化如何绕过常规的对象创建方法(new)提供一种“封装机制”来避免客户程序和这种“具体对象创建工作”的紧耦合
定义 工厂模式是一种创建型设计模式它提供一种通用的接口来创建对象但是让子类决定实例化哪个类。工厂模式将对象的创建过程封装在一个工厂类中避免直接调用构造函数提高代码的灵活性和可维护性。工厂模式实现了依赖倒置原则即面向接口编程而不是面向实现编程。 在工厂模式中有一个抽象工厂接口定义了工厂类应该实现的方法以及一组产品接口定义了工厂类应该创建的产品的通用行为。具体的工厂类实现了抽象工厂接口用于创建具体的产品对象。 工厂模式可以分为三种不同的类型简单工厂模式、工厂方法模式和抽象工厂模式。简单工厂模式只有一个工厂类它根据传入的参数来决定创建哪种类型的产品对象。工厂方法模式定义一个抽象工厂接口和一组产品接口每个具体的工厂类实现了抽象工厂接口并创建了一组具体的产品对象。抽象工厂模式定义一组抽象工厂接口和一组抽象产品接口每个具体的工厂类实现了一组抽象工厂接口每个具体的产品类实现了一组抽象产品接口。
应用场景
工厂模式适用于以下场景
需要创建复杂对象的场景可以使用工厂模式将对象的创建过程封装起来避免直接调用构造函数需要提供统一的接口来创建一组相关对象的场景可以使用工厂模式将相关对象的创建过程统一起来需要避免使用 new 关键字来创建对象的场景可以使用工厂模式来代替直接调用构造函数。 总的来说工厂模式是一种非常常用的设计模式可以提高代码的可维护性、灵活性和可扩展性因此在各种编程语言中都得到了广泛的应用。
模式结构 实现步骤
工厂模式的实现步骤如下 定义一个抽象产品接口用于定义一组产品的通用行为。 定义一个具体产品类实现抽象产品接口用于提供具体的产品实现。 定义一个抽象工厂接口用于定义工厂类应该实现的方法。 定义一个具体工厂类实现抽象工厂接口用于创建具体的产品对象。 在客户端代码中使用工厂类创建具体的产品对象。
C语言代码示例
下面是一个简单的 C 语言工厂模式的示例代码用于创建不同类型的车辆对象
#include stdio.h
#include stdlib.htypedef 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)会导致软件的脆弱。工厂设计模式通过面向对象的手法将所要创建的具体对象工作延迟到子类从而实现一种扩展而非更改的策略较好地解决了这种紧耦合关系。工厂设计模式解决“单个对象”的需求变化。缺点在于要求创建方法/参数相同。
需要注意的是过度使用工厂模式会增加代码的复杂性和额外的开销。因此在实际使用时应该根据具体情况进行选择选择最适合的实现方式。