使用简单工厂方法实现硬盘对象创建

1、简介 简单工厂方法定义一个用于创建对象的类,该类接受一个参数,通过参数决定创建不同的对象。
gof并没有把简单工厂方法定义为23种设计模式之一,可以认为简单工厂方法是工厂方法的简化形式。
为了体现简单工厂方法和工厂方法的区别和联系,此处把简单工厂方法先单独讲一下。
2、模拟场景 假设你要生产电脑,电脑由硬盘、内存条、cpu、主板的部件组成。你为了保证供应链可靠,每种部件都选择了至少两家供应商。比如:
硬盘供应商 seagate、toshiba
内存条供应商 samsung、crucial
cpu供应商 intel、amd
主板供应商 intel、amd
此处列出多个部件是为了后面讲解工厂方法、抽象工厂方法时使用同一个模拟场景。本章讲简单工厂方法暂时不需要涉及这么多部件,所以仅以硬盘这一个部件为例进行讲解。
3、实现的思路 硬盘就是要创建的对象(即:产品)。为了让不同供应商提供的硬盘可以通用,要定义一个硬盘产品类,并让不同供应商的硬盘都继承硬盘产品类的接口。
还需要定义一个创建硬盘对象的类(即:工厂)。工厂类根据参数决定创建哪家供应商的硬盘对象。
4、实现硬盘对象创建 参与者:
(1)product: harddisk 定义硬盘对象的接口
(2)concrete product: seagateharddisk, toshibaharddisk 实现不同供应商的硬盘
(3)simplefactory: harddiskfactory 根据参数,创建不同供应商的硬盘对象
uml:
harddisk代码示例:
hard_disk.h:
#ifndef hard_disk_h#define hard_disk_hstruct harddisk {    void (*operation)(struct harddisk *this);};#endif seagateharddisk代码示例:
seagate_hard_disk.h:
#ifndef seagate_hard_disk_h#define seagate_hard_disk_h#include hard_disk.hstruct seagateharddisk {    struct harddisk harddisk;};// 构造函数void seagateharddisk(struct seagateharddisk *this);// 析构函数void _seagateharddisk(struct seagateharddisk *this);#endif seagate_hard_disk.c:
#include seagate_hard_disk.h#include stdio.hvoid seagateoperation(struct seagateharddisk *this){    printf(这是 seagate 硬盘);}void seagateharddisk(struct seagateharddisk *this){    this->harddisk.operation = (void(*)(struct harddisk *))seagateoperation;}void _seagateharddisk(struct seagateharddisk *this){    this->harddisk.operation = null;} toshibaharddisk代码示例:
toshiba_hard_disk.h:
#ifndef toshiba_hard_disk_h#define toshiba_hard_disk_h#include hard_disk.hstruct toshibaharddisk {    struct harddisk harddisk;};// 构造函数void toshibaharddisk(struct toshibaharddisk *this);// 析构函数void _toshibaharddisk(struct toshibaharddisk *this);#endif toshiba_hard_disk.c:
#include toshiba_hard_disk.h#include stdio.hvoid toshibaoperation(struct toshibaharddisk *this){    printf(这是 toshiba 硬盘);}void toshibaharddisk(struct toshibaharddisk *this){    this->harddisk.operation = (void(*)(struct harddisk *))toshibaoperation;}void _toshibaharddisk(struct toshibaharddisk *this){    this->harddisk.operation = null;} harddiskfactory代码示例:
hard_disk_factory.h:
#ifndef hard_disk_factory_h#define hard_disk_factory_h#include hard_disk.henum hard_disk_supplier_e {    hard_disk_supplier_seagate,    hard_disk_supplier_toshiba};struct harddiskfactory {    struct harddisk* (*create)(struct harddiskfactory *this,                                enum hard_disk_supplier_e supplier);    void (*destroy)(struct harddiskfactory *this,                     struct harddisk* harddisk);};// 构造函数void harddiskfactory(struct harddiskfactory *this);// 析构函数void _harddiskfactory(struct harddiskfactory *this);#endif hard_disk_factory.c:
#include hard_disk_factory.h#include seagate_hard_disk.h#include toshiba_hard_disk.h#include stdio.h#include stdlib.hstruct harddisk *create(struct harddiskfactory *this,                         enum hard_disk_supplier_e supplier) {    switch (supplier) {        case hard_disk_supplier_seagate:        {            struct seagateharddisk *seagateharddisk = null;            if ((seagateharddisk = malloc(sizeof(struct seagateharddisk))) == null) {                printf(fail in malloc);                return null;            }            seagateharddisk(seagateharddisk);            return (struct harddisk *)seagateharddisk;        }        case hard_disk_supplier_toshiba:        {            struct toshibaharddisk *toshibaharddisk = null;            if ((toshibaharddisk = malloc(sizeof(struct toshibaharddisk))) == null) {                printf(fail in malloc);                return null;            }            toshibaharddisk(toshibaharddisk);            return (struct harddisk *)toshibaharddisk;        }        default:            printf(未知的供应商);            return null;    }}void destroy(struct harddiskfactory *this, struct harddisk* harddisk){    if (harddisk != null) {        free(harddisk);    }}// 构造函数void harddiskfactory(struct harddiskfactory *this){    this->create = create;    this->destroy = destroy;}// 析构函数void _harddiskfactory(struct harddiskfactory *this){    this->create = null;    this->destroy = null;} 客户端代码示例:
#include hard_disk.h#include hard_disk_factory.h#include stddef.hvoid main(){    struct harddisk *harddisk = null;    struct harddiskfactory harddiskfactory;    harddiskfactory(&harddiskfactory);        // 创建 seagate 硬盘对象    harddisk = harddiskfactory.create(&harddiskfactory, hard_disk_supplier_seagate);    // 使用 seagate 硬盘对象    harddisk->operation(harddisk);      // 销毁 seagate 硬盘对象    harddiskfactory.destroy(&harddiskfactory, harddisk);               // 创建 toshiba 硬盘对象    harddisk = harddiskfactory.create(&harddiskfactory, hard_disk_supplier_toshiba);    // 使用 seagate 硬盘对象    harddisk->operation(harddisk);    // 销毁 toshiba 硬盘对象    harddiskfactory.destroy(&harddiskfactory, harddisk);            _harddiskfactory(&harddiskfactory);} 客户端显示示例:
./hard_disk这是 seagate 硬盘这是 toshiba 硬盘
原文标题:c语言 | 简单工厂方法模式实现例子
文章出处:【微信公众号:凡亿pcb】欢迎添加关注!文章转载请注明出处。


SQL优化的一般步骤与案例分析
半导体行业未来发展方向究竟是什么?
一文详解i.MX 6Dual/6Quad主要特性及应用
自制的简易电视机天线
电阻应变式称重传感器原理
使用简单工厂方法实现硬盘对象创建
浩洋股份从舞台灯转战UV LED
关于模拟放大电路的特点分析
在全球高度的TCL,看到电视大屏与AI智能风口
推开“任意门”,华为全屋智能正在实现一代科幻迷的童年梦想
推荐系统中的矩阵分解技术
三星Note7自燃原因公布,三星S8会不会重蹈覆辙?
【行业动态】重磅政策启动!智能家居大范围普及的机会来了
华为安全大咖谈 | 华为终端检测与响应EDR 第06期:斩杀幽灵-高级威胁之三十六计
Global Foundries公司展示28nm制程芯片硅圆
电池系统集成及新能源汽车运营企业杉杉股份发布2022第一季度报告
OPPO Reno3 Pro值不值得买
未来再生医学中心 搭建首个“国家癌症早期检测技术应用示范中心”
共模扼流圈特征及运用范围
DLSS 2.0新增锐度调节 可避免过于模糊或者过于锐利