网站首页 > 教程分享 正文
介绍:
建造者模式是一种创建型设计模式,亦称创建者模式、生成器模式等;该模式是将一个复杂的对象分解为许多简单的对象,然后逐步构建出想要的产品,产品的最终形态都是一致的,但是具体组成的每个对象可能是不相同的;
优点:
- 将复杂对象的构建与表示分离;
- 只需要选择具体的组成对象即可创建出复杂的对象,无需知道建造细节;
类比:
一个台式机是由CPU、显卡、内存、硬盘等部件组成,我们可以根据自己的需求选择不同型号不同厂商的部件,比如说CPU选择Intel或者AMD的;在这里一个台式机就是由许多部件组成,每个组成部件都可能是不相同的,但是最终组成的都是一台台式机;
结构:
- 建造者(Builder):指定创建产品不同组成部分的方法;
- 具体建造者(Concrete Builder):实现Builder中的各个部件的具体创建方式;
- 指挥者(Director):定义构造的步骤完成对复杂对象的创建;
- 产品(Products):最终生成的对象;
代码示例:
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include "list.h"
static LIST_HEAD(computer_component);
typedef struct _Builder
{
void (*cpu)(void);
void (*gpu)(void);
void (*display)(void);
void (*show)(void);
} Computer_Builder;
typedef struct
{
const char* name;
const char* type;
} info_t;
typedef struct
{
info_t info;
ListObj list;
}cpu_t;
typedef struct
{
info_t info;
ListObj list;
}gpu_t;
typedef struct
{
info_t info;
ListObj list;
}display_t;
void Intel_cpu(void)
{
cpu_t* intel_cpu = (cpu_t*)malloc(sizeof(cpu_t));
assert(intel_cpu != NULL);
memset(intel_cpu, 0, sizeof(cpu_t));
intel_cpu->info.name = "Intel";
intel_cpu->info.type = "9400F";
list_insert_before(&computer_component, &intel_cpu->list);
}
void NVIDIA_gpu(void)
{
gpu_t* nvidia_cpu = (gpu_t*)malloc(sizeof(gpu_t));
assert(nvidia_cpu != NULL);
memset(nvidia_cpu, 0, sizeof(gpu_t));
nvidia_cpu->info.name = "NVIDIA";
nvidia_cpu->info.type = "RTX2060";
list_insert_before(&computer_component, &nvidia_cpu->list);
}
void Sony_display(void)
{
display_t* sony_display = (display_t*)malloc(sizeof(display_t));
assert(sony_display != NULL);
memset(sony_display, 0, sizeof(display_t));
sony_display->info.name = "SONY";
sony_display->info.type = "SN-600";
list_insert_before(&computer_component, &sony_display->list);
}
void show_computer(void)
{
ListObj *component;
list_for_each(component, &computer_component)
{
info_t* info = (info_t*)list_entry(component, cpu_t, list);
printf("name: %s, type: %s\r\n", info->name, info->type);
}
printf("===========\r\n\n");
}
Computer_Builder ConcreteBuilder = {.cpu = Intel_cpu, .gpu = NVIDIA_gpu, .display = Sony_display, .show = show_computer};
typedef struct
{
Computer_Builder* builder;
void (*min_component)(Computer_Builder* builder);
} Director_t;
void computer_min_component(Computer_Builder* builder)
{
builder->cpu();
}
void main(void)
{
Director_t director = {.builder = &ConcreteBuilder, .min_component = computer_min_component};
director.min_component(director.builder);
director.builder->show();
Computer_Builder* builder = &ConcreteBuilder;
builder->gpu();
builder->show();
builder->display();
builder->show();
}
代码中的链表操作是侵入式链表,和普通链表的作用是一样的,后续会专门出一篇文章介绍;
猜你喜欢
- 2024-10-18 信号 - Linux Signal - 网络编程的相关信号
- 2024-10-18 干货 | 一文搞定 pytest 自动化测试框架(一)
- 2024-10-18 linux网络编程—tcp和udp基本函数调用过程及如何选择
- 2024-10-18 C语言之结构体基础(c语言结构体经典例题)
- 2024-10-18 linux定时器编程详解(包含代码)(linux定时器执行脚本)
- 2024-10-18 C语言学习第16篇---三目运算符和逗号表达式
- 2024-10-18 Linux网络编程相关高级I/O函数 - 用于创建文件描述符的函数
- 2024-10-18 干货 | 一文搞定 pytest 自动化测试框架(二)
- 2024-10-18 现代c++之移动构造,移动赋值,拷贝构造,拷贝赋值
- 2024-10-18 探索C语言断言:保证程序的健壮性和可靠性
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- css导航条 (66)
- sqlinsert (63)
- js提交表单 (60)
- param (62)
- parentelement (65)
- jquery分享 (62)
- check约束 (64)
- curl_init (68)
- sql if语句 (69)
- import (66)
- chmod文件夹 (71)
- clearinterval (71)
- pythonrange (62)
- 数组长度 (61)
- javafx (59)
- 全局消息钩子 (64)
- sort排序 (62)
- jdbc (69)
- php网页源码 (59)
- assert h (69)
- httpclientjar (60)
- postgresql conf (59)
- winform开发 (59)
- mysql数字类型 (71)
- drawimage (61)
本文暂时没有评论,来添加一个吧(●'◡'●)