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新增锐度调节 可避免过于模糊或者过于锐利