工厂模式:Define an interface for creating an object,but let subclasses decide which class to instantiate.Factory Method lets a class defer instantiation to subclasses.(定义一个用于创建对象的接口, 让子类决定实例化哪一个类。 工厂方法使一个类的实例化延迟到其子类。 )
UML图:
‘+' 表示public, '-' 表示private,“#' 表示protected.”
一文掌握14种UML图-腾讯云开发者社区-腾讯云 (tencent.com)
简单工厂模式:
代码实现:
#include <stdio.h>
// 定义产品接口
typedef struct {
void (*operation)();
} Product;
// 具体产品A
typedef struct {
Product product;
} ConcreteProductA;
void ConcreteProductA_operation() {
printf("具体产品 A 的操作\n");
}
// 具体产品B
typedef struct {
Product product;
} ConcreteProductB;
void ConcreteProductB_operation() {
printf("具体产品 B 的操作\n");
}
// 工厂类
typedef struct {
Product* (*createProduct)(char);
} Factory;
Product* Factory_createProduct(char type) {
switch (type) {
case 'A':
return (Product*)malloc(sizeof(ConcreteProductA));
case 'B':
return (Product*)malloc(sizeof(ConcreteProductB));
default:
return NULL;
}
}
int main() {
Factory factory;
factory.createProduct = Factory_createProduct;
// 创建产品A
Product* productA = factory.createProduct('A');
productA->operation(productA);
// 创建产品B
Product* productB = factory.createProduct('B');
productB->operation(productB);
free(productA);
free(productB);
return 0;
}
在上述示例中,我们定义了一个产品接口 Product
,并以具体产品A和具体产品B实现该接口。然后,我们定义了一个工厂类 Factory
,它包含一个用于创建产品的函数 createProduct
。
在 createProduct
函数中,我们根据输入的类型参数来创建不同的产品对象。如果类型是 'A',则分配内存给 ConcreteProductA
对象;如果类型是 'B',则分配内存给 ConcreteProductB
对象。最后,我们在 main
函数中使用工厂类来创建产品并调用其操作函数。
简单工厂模式(Simple Factory Pattern)是一种创建型设计模式,它提供了一个统一的工厂类,通过传入不同的参数来创建不同的产品对象。简单工厂模式将对象的创建逻辑封装在工厂类中,客户端只需通过工厂类来获取所需的产品对象,而无需关心具体的创建过程。
优点:
- 简化对象的创建:简单工厂模式可以将对象的创建逻辑集中到一个工厂类中,使得客户端无需关心具体的创建细节,只需通过工厂类获取所需的产品对象。
- 解耦客户端和具体产品类:客户端只依赖工厂类接口,而不依赖具体的产品类。这样在需要更换或新增产品时,只需修改工厂类,而无需修改客户端代码。
- 隐藏具体实现细节:工厂类可以对客户端隐藏具体产品的实现细节,只暴露工厂方法接口给客户端使用。
缺点:
- 不符合开闭原则:当需要新增产品时,需要修改工厂类的代码,违反了开闭原则。这意味着对于每个新增的产品,都需要修改工厂类,可能导致工厂类变得庞大而复杂。
- 产品创建逻辑集中在一个类中:简单工厂模式将对象的创建逻辑集中在一个工厂类中,当产品较多时,工厂类可能会变得复杂,不易于维护和扩展。
适用场景:
简单工厂模式适用于以下情况:
- 对象的创建逻辑相对简单,并且不需要频繁变动。
- 客户端只需要通过一个统一的接口来获取产品对象,而无需关心具体的创建过程。
- 当需要隐藏产品的实现细节,只暴露工厂方法给客户端使用时。
需要注意的是,简单工厂模式并不是一个严格的设计模式,它更像是一种编程习惯或者一种简化对象创建的方法。在具体项目中,根据实际需求和复杂度,可以选择使用其他更灵活和可扩展的创建型设计模式,如工厂方法模式或抽象工厂模式。