设计模式
创建型模式(Creational Patterns)
这些模式关注对象的创建过程,通过将对象的实例化与客户端代码的解耦来实现灵活性和可维护性。常见的创建型模式包括:工厂模式、抽象工厂模式、单例模式、原型模式和建造者模式。
单例模式
定义
单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来访问该实例。单例模式常用于需要限制实例化次数、在系统中共享资源或控制一些共享操作的情况下。
#include <stdio.h>
// 定义全局变量作为单例实例
static Singleton* instance = NULL;
// 定义单例结构体
typedef struct {
// 添加需要共享的数据成员
int data;
} Singleton;
// 获取单例实例的函数
Singleton* getSingletonInstance() {
if (instance == NULL) {
// 创建新的实例
instance = (Singleton*)malloc(sizeof(Singleton));
instance->data = 0;
}
return instance;
}
int main() {
// 获取单例实例
Singleton* singleton = getSingletonInstance();
// 使用单例实例
singleton->data = 10;
printf("Data: %d\n", singleton->data);
return 0;
}
备注: 上述示例中的单例模式不考虑多线程的并发访问情况。如果在多线程环境下使用单例模式,需要考虑线程安全性,可以使用互斥锁等机制来保证只有一个线程能够创建实例
工厂模式
工厂模式是一种创建对象的设计模式,它提供了一种统一的方式来创建不同类型的对象,而无需直接指定其具体的类。工厂模式通过将对象的实例化过程封装在一个工厂类中,客户端只需要与工厂类进行交互,而不需要关心具体的对象创建细节。
在C语言中,可以使用函数指针作为工厂模式的一种实现方式
是通过使用一个共同的接口来指向新创建的对象
#include <stdio.h>
#include <stdlib.h>
// 定义产品类型
typedef enum {
ProductA,
ProductB
} ProductType;
// 产品结构体
typedef struct {
ProductType type;
// 其他成员
} Product;
// 创建产品A的函数
Product* createProductA() {
Product* product = (Product*)malloc(sizeof(Product));
product->type = ProductA;
// 其他初始化操作
return product;
}
// 创建产品B的函数
Product* createProductB() {
Product* product = (Product*)malloc(sizeof(Product));
product->type = ProductB;
// 其他初始化操作
return product;
}
// 工厂函数,根据产品类型返回对应的函数功能
Product* createProduct(ProductType type) {
switch (type) {
case ProductA:
return createProductA();
case ProductB:
return createProductB();
default:
return NULL;
}
}
int main() {
// 使用工厂函数创建产品,实例化
Product* productA = createProduct(ProductA);
Product* productB = createProduct(ProductB);
// 使用产品
printf("Product A type: %d\n", productA->type);
printf("Product B type: %d\n", productB->type);
// 释放资源
free(productA);
free(productB);
return 0;
}
例子2 定义抽象方法的函数指针类型,把这个类型用于结构体里面(可以在结构体里面放Struct 以及对这个Struct操作的方法类型),然后实例化结构体(变量赋值),定义具体的方法,最后赋值方法.
#include <stdio.h>
#include <stdlib.h>
// 定义抽象方法的函数指针类型
typedef void (*AbstractMethod)();
// 定义包含抽象方法的结构体
typedef struct {
AbstractMethod method;
} AbstractStruct;
// 具体实现的方法1
void concreteMethod1() {
printf("This is concrete method 1.\n");
}
// 具体实现的方法2
void concreteMethod2() {
printf("This is concrete method 2.\n");
}
// 实例化结构体并调用抽象方法
AbstractStruct* createAbstractStruct(int size) {
AbstractStruct* instance = malloc(size * sizeof(AbstractStruct));
return instance;
}
int main() {
int size = 3;
// 创建结构体数组实例
AbstractStruct* myStructArray = createAbstractStruct(size);
// 初始化结构体数组中的元素,指定具体实现的方法1和方法2
myStructArray[0].method = concreteMethod1;
myStructArray[1].method = concreteMethod2;
myStructArray[2].method = concreteMethod1;
// 调用结构体数组中的抽象方法
for (int i = 0; i < size; i++) {
myStructArray[i].method();
}
// 释放内存
free(myStructArray);
return 0;
}
抽象模式
结构型模式(Structural Patterns)
这些模式关注对象之间的组合和关联关系,以实现更大规模结构的灵活性和扩展性。常见的结构型模式包括:适配器模式、桥接模式、装饰器模式、外观模式、享元模式和组合模式。
行为型模式(Behavioral Patterns)
这些模式关注对象之间的通信和交互,以实现更好的代码组织和流程控制。常见的行为型模式包括:观察者模式、策略模式、模板方法模式、迭代器模式、命令模式、状态模式、职责链模式和访问者模式。
并发模式(Concurrency Patterns)
这些模式关注在并发环境中处理多个线程或进程之间的交互和同步。常见的并发模式包括:锁模式、信号量模式、线程池模式、并发容器模式和保护性暂停模式。
架构模式(Architectural Patterns)
这些模式关注整体系统的组织结构和架构,以实现系统的可扩展性、稳定性和可维护性。常见的架构模式包括:MVC 模式、MVP 模式、MVVM 模式、微服务架构和领域驱动设计(DDD)。