C语言工厂方法模式,工厂函数模式 (C语言实现)

工厂模式属于创建型模式,大致可以分为三类,简单工厂模式、工厂方法模式、抽象工厂模式。

二. 工厂方法模式

所谓工厂方法模式,是指定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。

还以刚才的例子解释,这家电子厂赚了不少钱,于是决定再开设一个厂,其中一个工厂专门用来生产A型号的产品,也就是只生产电吹风,而另一工厂专门用来生产B型号的产品,也就是只生产电风扇,这样分工明确了。以后客户要再下定单时,可以直接找到相关的工厂了,比如要A型号的产品,就找A工厂要,不再担心下的定单是A,生产出来的是B产品了。

0818b9ca8b590ca3270a3433284dd417.png

代码实现:

abstractClass.h

#ifndef ABSTRACTCLASS_H

#define ABSTRACTCLASS_H

#include

#include

typedef struct {

size_t size;

void* (*ctor)(void *_self, va_list *params);

void* (*dtor)(void *_self);

} AbstractClass;

#endif

factory.h

#ifndef FACTORY_H

#define FACTORY_H

#include

#include

typedef struct {

size_t size;

void* (*ctor)(void *_self, va_list *params);

void* (*dtor)(void *_self);

void* (*createProduct)(const void *_self);

} Factory;

#endif

factoryA.h

#ifndef FACTORYA_H

#define FACTORYA_H

typedef struct {

const void *_;

} _FactoryA;

extern const void *FactoryA;

#endif

factoryA.c

#include "factory.h"

#include "factoryA.h"

#include "productA.h"

#include "new.h"

#include

static void *factoryACtor(void *_self, va_list *params){

_FactoryA *self = _self;

return self;

}

static void *factoryADtor(void *_self) {

_FactoryA *self = _self;

return self;

}

static void* factoryACreateProduct(const void *self) {

return New(ProductA);

}

static const Factory _factory = {

sizeof(_FactoryA),

factoryACtor,

factoryADtor,

factoryACreateProduct

};

const void *FactoryA = &_factory;

factoryB.h

#ifndef FACTORYB_H

#define FACTORYB_H

typedef struct {

const void *_;

} _FactoryB;

extern const void *FactoryB;

#endif

factoryB.c

#include "factory.h"

#include "factoryB.h"

#include "productB.h"

#include "new.h"

#include

static void *factoryBCtor(void *_self, va_list *params){

_FactoryB *self = _self;

return self;

}

static void *factoryBDtor(void *_self) {

_FactoryB *self = _self;

return self;

}

static void* factoryBCreateProduct(const void *self) {

return New(ProductB);

}

static const Factory _factory = {

sizeof(_FactoryB),

factoryBCtor,

factoryBDtor,

factoryBCreateProduct

};

const void *FactoryB = &_factory;

product.h

#ifndef PRODUCT_H

#define PRODUCT_H

#include

#include

typedef struct {

size_t size;

void* (*ctor)(void *_self, va_list *params);

void* (*dtor)(void *_self);

void (*show)(const void *_self);

} Product;

#endif

productA.h

#ifndef PRODUCTA_H

#define PRODUCTA_H

typedef struct {

const void *_;

} _ProductA;

extern const void *ProductA;

#endif

productA.c

#include "product.h"

#include "productA.h"

#include

#include

static void *productACtor(void *_self, va_list *params) {

_ProductA *self = _self;

return self;

}

static void *productADtor(void *_self) {

_ProductA *self = _self;

return self;

}

static void productAShow(const void *_self) {

(void)_self;

fprintf(stdout, "Product A\n");

}

static const Product _product = {

sizeof(_ProductA),

productACtor,

productADtor,

productAShow

};

const void *ProductA = &_product;

productB.h

#ifndef PRODUCTB_H

#define PRODUCTB_H

typedef struct {

const void *_;

} _ProductB;

extern const void *ProductB;

#endif

productB.c

#include "product.h"

#include "productB.h"

#include

#include

#include

static void *productBCtor(void *_self, va_list *params) {

_ProductB *self = _self;

return self;

}

static void *productBDtor(void *_self) {

_ProductB *self = _self;

return self;

}

static void productBShow(const void *_self) {

(void)_self;

fprintf(stdout, "Product B\n");

}

static const Product _product = {

sizeof(_ProductB),

productBCtor,

productBDtor,

productBShow

};

const void *ProductB = &_product;

new.h

#ifndef NEW_H

#define NEW_H

void *New(const void *_class, ...);

void Delete(void *_class);

void *CreateProduct(const void *_factory);

void Show(const void *product);

#endif

new.c

#include "new.h"

#include "abstractClass.h"

#include "factory.h"

#include "product.h"

#include

#include

#include

#include

void *New(const void *_class, ...) {

const AbstractClass *class = _class;

void *p = calloc(1, class->size);

assert(p);

*(const AbstractClass **)p = class;

if (class->ctor) {

va_list params;

va_start(params, _class);

p = class->ctor(p, ¶ms);

va_end(params);

}

return p;

}

void Delete(void *_class) {

const AbstractClass **class = _class;

if (_class && *class && (*class)->dtor) {

_class = (*class)->dtor(_class);

}

free(_class);

}

void *CreateProduct(const void *_factory) {

const Factory * const *factory = _factory;

if (_factory && *factory && (*factory)->createProduct) {

return (*factory)->createProduct(_factory);

} else {

return NULL;

}

}

void Show(const void *_product) {

const Product * const *product = _product;

if (_product && *product && (*product)->show) {

(*product)->show(_product);

}

}

main.c

#include "new.h"

#include "factoryA.h"

#include "factoryB.h"

int main(int argc, char *argv[]) {

void *facA = New(FactoryA);

void *facB = New(FactoryB);

void *pro1 = CreateProduct(facA);

void *pro2 = CreateProduct(facB);

void *pro3 = CreateProduct(facA);

Show(pro1);

Show(pro2);

Show(pro3);

Delete(facA);

Delete(facB);

Delete(pro1);

Delete(pro2);

Delete(pro3);

return 0;

}

图片来源:http://blog.csdn.net/hmsiwtv/article/details/9627109

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/571362.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言代码 linux 关机_android linux 关机流程

To power off an Android phone, keep pressing power bottom then shutdown menu is appeard. Then choose ‘Power OFF’ to power off actually.I looked for the source code to see how to do these sequence.(Japanese version of this page)Showing shutdown menuHere i…

光绘文件 c语言 解析,AltiumDesigner输出光绘文件

1、钻孔信息生成设置打开PCB文件,放置钻孔位图符号对应的孔大小的列表:切换到DrillDrawing层放置字符串,Place->string(PS),此时按Tab键,在出现的Text文本框中点击下拉箭头,选择.Legend,OK。…

logback日志pattern_Logback pattern transactionid 中如何自定义灵活的日志过滤规则

当我们需要对日志的打印要做一些范围的控制的时候,通常都是通过为各个Appender设置不同的Filter配置来实现。在Logback中自带了两个过滤器实现:ch.qos.logback.classic.filter.LevelFilter和ch.qos.logback.classic.filter.ThresholdFilter,用…

曼哈顿距离最小生成树与莫队算法(总结)

曼哈顿距离最小生成树与莫队算法(总结) 1 曼哈顿距离最小生成树 曼哈顿距离最小生成树问题可以简述如下: 给定二维平面上的N个点,在两点之间连边的代价为其曼哈顿距离,求使所有点连通的最小代价。 朴素的算法可以用O(N…

功能引导 android,Flutter实现App功能引导页

App功能介绍页,主要是由介绍app功能的几张图片和当前页指示符组成,如下效果我们来一步一步实现上面的界面,左右滑动切换显示功能页,这个可以通过PageView来实现,底部的指示符半透明覆盖在PageView上,开发过Android同学知道可以用Framelayout布局来实现&a…

vue项目调用jssip_JsSIP和FreeSWITCH整合

写在前面:FreeSWITCH作为服务器,通过SIP协议,Web端使用jssipwebrtc和其他软电话进行通信一、先配置FreeSWITCH(用的版本1.6.20)的配置:1 、修改vars.xml文件,找到下面字段,并设置2、修改 autoload_configs/…

ios禁止页面下拉

document.querySelector(body).addEventListener(touchmove, function(e) { e.preventDefault();})此类事件是手机touchmove默认事件行为,可以通过js代码禁止默认事件:转载于:https://www.cnblogs.com/zhouyx/p/8145182.html

android中虚拟程序停止,为什么我的在虚拟机运行后出现应用程序停止运行

源自:9-2 使用ToggleButton按钮实现开关效果为什么我的在虚拟机运行后出现应用程序停止运行package com.example.sss;import com.example.android4_0.R;import android.app.Activity;import android.os.Bundle;import android.view.Menu;import android.view.MenuIt…

android layout(l, t, r, b);,服务器里的a,t,l,r,b是什么意思? Android编程中关于layout(l,t,r,b)函数的问题...

导航:网站首页 >服务器里的a,t,l,r,b是什么意思? Android编程中关于layout(l,t,r,b)函数的问题服务器里的a,t,l,r,b是什么意思? Android编程中关于layout(l,t,r,b)函数的问题相关问题:匿名网友:我们知道,屏幕的分辨率往往以“像素数 x 像素数”的格…

python里else中文意思_Python循环语句中else的用法总结

前言本文讨论Python的for…else和while…else等语法,这些是Python中最不常用、最为误解的语法特性之一。Python中的for、while等循环都有一个可选的else分支(类似if语句和try语句那样),在循环迭代正常完成之后执行。换句话说,如果我们不是以除…

go语言 方法

go 语言中没有类,但是是有方法。 方法的定义: func (recevier type) methodName(参数列表)(返回值列表){ } type School struct {Name stringAddr string }func NewSchool(name, addr string) *School {return &School {Name:name,Addr:addr,} }fun…

android 获取加速度传感器值,Android开发获取传感器数据的方法示例【加速度传感器,磁场传感器,光线传感器,方向传感器】...

本文实例讲述了Android开发获取传感器数据的方法。分享给大家供大家参考,具体如下:package mobile.android.sensor;import java.util.List;import android.app.Activity;import android.hardware.Sensor;import android.hardware.SensorEvent;import and…

ocp oracle 考试报名_获得Oracle认证对拓展职业前景的影响

知识就是力量通过考试和考试成绩固然很重要,但您在学习过程中所掌握的知识才是您职业成功的坚实基础。在备考过程中,获得的知识和经验才是您真正的财富。Oracle Certified Associate (OCA):专员级别的认证能够证明学员具备基本技能&#xff0…

SpringMVC(2)—SpringMVC整合Spring的HelloWorld

一、这是一个SpringMVC框架的案例HelloWorld 功能&#xff1a;HelloWorld 二、SpringMVC运行流程 1.流程 请求——>springDispatcherServlet的url-pattern检查SpringMVC中是否存在对应的映射无&#xff1a;检查是否配置的<mvc:default-servlet-handler/>无&#xff…

mac android 录屏软件下载,苹果录屏app下载 苹果录屏 for Android V2.1.3 安卓手机版 下载-脚本之家...

苹果录屏是一款不错的手机录屏软件&#xff0c;该软件能帮助你录制流畅清晰视频&#xff0c;实现屏幕内容实时同步录制&#xff0c;录制视频流畅清晰不卡顿&#xff0c;需要的朋友可以下载使用。应用介绍苹果录屏&#xff0c;是一款免费屏幕录制软件&#xff0c;能帮助你录制流…

火箭技术术语_仿真优化火箭发动机 3D 打印制造工艺

台湾工业技术研究院(ITRI)为台湾创新空间(TiSPACE)提供增材制造(也称 3D 打印技术)服务&#xff0c;包括原始设计制造、重新设计和仿真等。TiSPACE 的固液火箭发动机中使用的燃料喷射器组件的 3D 打印过程为&#xff1a;首先&#xff0c;激光将第一层粉末熔化并融合到构建板上&…

车林通购车之家--购车计算器模块--保险

//car-calculator-bx.twig {{ include(jsq-nav.twig) }} <div class"switch-item active" id"bodya"><div class"top-layer2 clearfix"><div class"tit"><span>新车保险市场价</span></div><…

麒麟710f能否升级到鸿蒙系统,定了!麒麟710以上支持升级鸿蒙系统,荣耀也可以升级...

原标题&#xff1a;定了&#xff01;麒麟710以上支持升级鸿蒙系统&#xff0c;荣耀也可以升级华为Mate X2发布会上&#xff0c;余承东表示4月份推送手机版鸿蒙系统&#xff0c;距离首发日期越来越近。不少朋友关心&#xff0c;哪些机型支持鸿蒙系统&#xff0c;荣耀手机可以更新…

我的奇思妙想机器人消防员_我是小小消防员(绘画篇)|来啊~斗图啊~看一场奇思妙想SHOW!...

点击上方 “四川消防119” 关注我们来&#xff0c;来&#xff0c;来快来进入孩子们脑洞大开的世界吧&#xff01;自今年6月以来&#xff0c;我们火热开展了“暑期消防安全教育专项行动”之“我是小小消防员”儿童消防绘画、作文竞赛活动&#xff0c;吸引了全省幼儿园小盆友、小…

mysql数据备份(windows,linux)

今天我有个朋友让我帮他在windowServer服务器上备份一下mysql的数据库&#xff0c;于是花了一天的时间完成了一个每天定时备份数据库的功能&#xff0c;小编在这里为大家记录一下&#xff1a; 首先对于mysql命令行的导入导出作一个简单的梳理 一、导入 ①mysql -h主机 -u账号 -…