0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

凡亿PCB 来源:CSDN技术社区 作者:大白白Going 2022-05-14 14:07 次阅读

1、简介

简单工厂方法定义一个用于创建对象的类,该类接受一个参数,通过参数决定创建不同的对象。

GOF并没有把简单工厂方法定义为23种设计模式之一,可以认为简单工厂方法是工厂方法的简化形式。

为了体现简单工厂方法和工厂方法的区别和联系,此处把简单工厂方法先单独讲一下。

2、模拟场景

假设你要生产电脑,电脑由硬盘、内存条、CPU、主板的部件组成。你为了保证供应链可靠,每种部件都选择了至少两家供应商。比如:

硬盘供应商 seagate、Toshiba

内存条供应商 SAMSUNG、Crucial

CPU供应商 intelAMD

主板供应商 intel、AMD

此处列出多个部件是为了后面讲解工厂方法、抽象工厂方法时使用同一个模拟场景。本章讲简单工厂方法暂时不需要涉及这么多部件,所以仅以硬盘这一个部件为例进行讲解。

3、实现的思路

硬盘就是要创建的对象(即:产品)。为了让不同供应商提供的硬盘可以通用,要定义一个硬盘产品类,并让不同供应商的硬盘都继承硬盘产品类的接口

还需要定义一个创建硬盘对象的类(即:工厂)。工厂类根据参数决定创建哪家供应商的硬盘对象。

4、实现硬盘对象创建

参与者:

(1)Product: HardDisk 定义硬盘对象的接口

(2)Concrete Product: SeagateHardDisk, ToshibaHardDisk 实现不同供应商的硬盘

(3)SimpleFactory: HardDiskFactory 根据参数,创建不同供应商的硬盘对象

UML:

0ac0aaf8-d316-11ec-bce3-dac502259ad0.png

HardDisk代码示例:

hard_disk.h:

#ifndefHARD_DISK_H
#defineHARD_DISK_H

structHardDisk{
void(*Operation)(structHardDisk*this);
};

#endif

SeagateHardDisk代码示例:

seagate_hard_disk.h:

#ifndefSEAGATE_HARD_DISK_H
#defineSEAGATE_HARD_DISK_H

#include"hard_disk.h"

structSeagateHardDisk{
structHardDiskhardDisk;
};

//构造函数
voidSeagateHardDisk(structSeagateHardDisk*this);

//析构函数
void_SeagateHardDisk(structSeagateHardDisk*this);

#endif

seagate_hard_disk.c:

#include"seagate_hard_disk.h"
#include"stdio.h"

voidSeagateOperation(structSeagateHardDisk*this)
{
printf("这是Seagate硬盘
");
}

voidSeagateHardDisk(structSeagateHardDisk*this)
{
this->hardDisk.Operation=(void(*)(structHardDisk*))SeagateOperation;
}

void_SeagateHardDisk(structSeagateHardDisk*this)
{
this->hardDisk.Operation=NULL;
}

ToshibaHardDisk代码示例:

toshiba_hard_disk.h:

#ifndefTOSHIBA_HARD_DISK_H
#defineTOSHIBA_HARD_DISK_H

#include"hard_disk.h"

structToshibaHardDisk{
structHardDiskhardDisk;
};

//构造函数
voidToshibaHardDisk(structToshibaHardDisk*this);

//析构函数
void_ToshibaHardDisk(structToshibaHardDisk*this);

#endif

toshiba_hard_disk.c:

#include"toshiba_hard_disk.h"
#include"stdio.h"

voidToshibaOperation(structToshibaHardDisk*this)
{
printf("这是Toshiba硬盘
");
}

voidToshibaHardDisk(structToshibaHardDisk*this)
{
this->hardDisk.Operation=(void(*)(structHardDisk*))ToshibaOperation;
}

void_ToshibaHardDisk(structToshibaHardDisk*this)
{
this->hardDisk.Operation=NULL;
}

HardDiskFactory代码示例:

hard_disk_factory.h:

#ifndefHARD_DISK_FACTORY_H
#defineHARD_DISK_FACTORY_H

#include"hard_disk.h"

enumHARD_DISK_SUPPLIER_E{
HARD_DISK_SUPPLIER_SEAGATE,
HARD_DISK_SUPPLIER_TOSHIBA
};

structHardDiskFactory{
structHardDisk*(*Create)(structHardDiskFactory*this,
enumHARD_DISK_SUPPLIER_Esupplier);
void(*Destroy)(structHardDiskFactory*this,
structHardDisk*hardDisk);
};

//构造函数
voidHardDiskFactory(structHardDiskFactory*this);

//析构函数
void_HardDiskFactory(structHardDiskFactory*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.h"

structHardDisk*Create(structHardDiskFactory*this,
enumHARD_DISK_SUPPLIER_Esupplier)
{
switch(supplier){
caseHARD_DISK_SUPPLIER_SEAGATE:
{
structSeagateHardDisk*seagateHardDisk=NULL;
if((seagateHardDisk=malloc(sizeof(structSeagateHardDisk)))==NULL){
printf("failinmalloc
");
returnNULL;
}
SeagateHardDisk(seagateHardDisk);
return(structHardDisk*)seagateHardDisk;
}
caseHARD_DISK_SUPPLIER_TOSHIBA:
{
structToshibaHardDisk*toshibaHardDisk=NULL;
if((toshibaHardDisk=malloc(sizeof(structToshibaHardDisk)))==NULL){
printf("failinmalloc
");
returnNULL;
}
ToshibaHardDisk(toshibaHardDisk);
return(structHardDisk*)toshibaHardDisk;
}
default:
printf("未知的供应商
");
returnNULL;
}
}

voidDestroy(structHardDiskFactory*this,structHardDisk*hardDisk)
{
if(hardDisk!=NULL){
free(hardDisk);
}
}

//构造函数
voidHardDiskFactory(structHardDiskFactory*this)
{
this->Create=Create;
this->Destroy=Destroy;
}

//析构函数
void_HardDiskFactory(structHardDiskFactory*this)
{
this->Create=NULL;
this->Destroy=NULL;
}

客户端代码示例:

#include"hard_disk.h"
#include"hard_disk_factory.h"
#include"stddef.h"

voidmain()
{
structHardDisk*hardDisk=NULL;

structHardDiskFactoryhardDiskFactory;
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】欢迎添加关注!文章转载请注明出处。

审核编辑:汤梓红


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 硬盘
    +关注

    关注

    3

    文章

    1233

    浏览量

    56303
  • 对象
    +关注

    关注

    1

    文章

    38

    浏览量

    17291

原文标题:C语言 | 简单工厂方法模式实现例子

文章出处:【微信号:FANYPCB,微信公众号:凡亿PCB】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    labview 面向对象(oop)实现图像采集

    `最近有很多学员在问面对对象能否运用在视觉中,确实面对对象的概念太抽象,不好理解,更别说和视觉相结合,如何将视觉中的一些变量或簇抽象成为类,如何封装,今天给大家简单介绍下,大家共同探讨。创建
    发表于 07-26 01:24

    抽象工厂模式的创建

    抽象工厂模式(Abstract Factory Pattern)提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于
    发表于 11-04 06:13

    如何用java映射创建java对象和调用java对象

    java是一种解析语言,java程序是通过java虚拟机解析.class的方式运行起来。因此,java中就存在java映射的概念。下面介绍如何用java映射创建java对象和调用java对象
    发表于 04-11 14:43

    解读rtt的c的面向对象对象创建及其启动初始化流程

    );面向对象语言的创建对象、继承父类,写代码很简单,而c面向对象则需要把这一套机制给实现。4 r
    发表于 07-05 11:01

    硬盘来货简单检测方法

    硬盘来货简单检测方法
    发表于 12-29 11:33 0次下载

    java如何创建对象的分析

    的例子还有它们的字节码 如果你运行了末尾的的程序,你会发现方法1,2,3用构造函数创建对象方法4,5没有调用构造函数。 1.使用new关键字 这是最常见也是最
    发表于 09-27 14:36 0次下载

    实例分析Java中创建对象

    Java中有5种创建对象的方式,下面给出它们的例子还有它们的字节码 Paste_Image.png 如果你运行了末尾的的程序,你会发现方法1,2,3用构造函数创建
    发表于 09-28 13:29 0次下载

    JavaScript创建对象的方式

    JavaScript中有几种创建对象的方式,本文将一一介绍,工厂模式、构造函数模式、原型模式、动态原型模式、组合使用构造函数模式和原型模式。
    的头像 发表于 02-22 09:32 3603次阅读
    JavaScript<b class='flag-5'>创建</b><b class='flag-5'>对象</b>的方式

    使用JavaScript创建对象方法和案例

    Javascript中的一切几乎都是对象,无论是数组还是函数。本文将教你使用JavaScript创建对象的三种方法
    的头像 发表于 07-06 09:41 2722次阅读

    详解ADI智能工厂方

    — ADI 智能工厂方案》在线培训课程,由ADI亚太区工业自动化行业市场部经理于常涛讲解ADI 智能工厂方案。
    的头像 发表于 01-21 10:48 1492次阅读

    在JavaScript中动态的创建QML对象

    在实际QML应用开发中,我们可以在JavaScript中动态的创建QML对象。这样做可以延迟对象的实例化,当我们在需要创建对象的时候才在Ja
    的头像 发表于 09-01 10:42 1276次阅读

    Java中创建对象有哪些方式

    1 问题 作为Java开发者,经常创建很多对象,你是否知道Java中创建对象有哪些方式呢?
    的头像 发表于 02-24 10:29 852次阅读

    C语言简单工厂方法实例

    简单工厂方法定义一个用于创建对象的类,该类接受一个参数,通过参数决定创建不同的对象
    的头像 发表于 04-03 10:06 571次阅读

    C语言简单工厂方法编程案例解析

    硬盘就是要创建对象(即:产品)。为了让不同供应商提供的硬盘可以通用,要定义一个硬盘产品类,并让不同供应商的
    发表于 04-05 10:41 286次阅读

    Java反射技术实现对象创建

    一. 基础概念 Java中,一般我们创建一个对象可能会选择new一下个实例。但是随着我们技术的不断提升,我们也学习到了,可以通过反射技术实现对象
    的头像 发表于 05-22 14:25 1600次阅读
    Java反射技术<b class='flag-5'>实现</b><b class='flag-5'>对象</b>的<b class='flag-5'>创建</b>