简单工厂模式C语言实现
来源:互联网 发布:火车头软件下载 编辑:程序博客网 时间:2024/04/29 00:01
【说明】简单工厂模式的C语言实现,改写自http://blog.csdn.net/sx_wpc/article/details/7645062一文的代码。
【代码清单】
typedef.h
#ifndef __TYPEDEF_H__#define __TYPEDEF_H__#include <stdio.h>#include <stdlib.h>#ifdef __cplusplusextern "C" {#endiftypedef enum _Ret{RET_OK,RET_FAIL}Ret;#define return_if_fail(p)\if(!(p)){\printf("%s:%d Warning:"#p"Failed\n",__func__,__LINE__);\return;}#define return_val_if_fail(p, ret)\if(!(p)){\printf("%s:%d Warning:"#p"Failed\n",__func__,__LINE__);\return (ret);}#define SAFE_FREE(p) if(p != NULL){free(p); p = NULL;}#ifdef __cplusplus}#endif#endif
product.h
#ifndef __PRODUCT_H__#define __PRODUCT_H__#include <assert.h>#include "typedef.h"#ifdef __cplusplusextern "C" {#endifstruct _Operation;typedef struct _Operation Operation;struct _Result;typedef struct _Result Result;typedef Result* (*ResultFunc)(int a, int b);typedef void (*DestroyFunc)(Operation* thiz);struct _Result{int val;};struct _Operation{ResultFunc result;DestroyFunc destroy;};static inline Result* oper_result(Operation *thiz, int a, int b){return_val_if_fail(thiz != NULL, NULL);if(thiz->result != NULL){return thiz->result(a, b);}}static inline void oper_destroy(Operation *thiz){if(thiz != NULL && thiz->destroy != NULL){thiz->destroy(thiz);}return ;}#ifdef __cplusplus}#endif#endif
producta.h
#ifndef __PRODUCTA_H__#define __PRODUCTA_H__#include "product.h"#ifdef __cplusplusextern "C" {#endiftypedef struct _Add Add;typedef Result* (*AddResultFunc)(int a, int b);typedef void (*AddDestroyFunc)(Add* thiz);struct _Add{AddResultFunc add_result;AddDestroyFunc add_destroy;};Add *oper_add_create(void);#ifdef __cplusplus}#endif#endif
producta.c
#include <stdio.h>#include <stdlib.h>#include <assert.h>#include "producta.h"#include "typedef.h"static Result *oper_add_result(int a, int b){Result *result = malloc(sizeof(Result));if(result != NULL){result->val = a + b;}return result;}static void oper_add_destroy(Add *thiz){if(thiz != NULL){SAFE_FREE(thiz);}return ;}Add *oper_add_create(void){Add *thiz = malloc(sizeof(Add));if(thiz != NULL){thiz->add_result = oper_add_result;thiz->add_destroy = oper_add_destroy;}return thiz;}
productb.h
#ifndef __PRODUCTB_H__#define __PRODUCTB_H__#include "product.h"#ifdef __cplusplusextern "C" {#endifstruct _Minus;typedef struct _Minus Minus;typedef Result* (*MinusResultFunc)(int a, int b);typedef void (*MinusDestroyFunc)(Minus* thiz);struct _Minus{MinusResultFunc minus_result;MinusDestroyFunc minus_destroy;};Minus *oper_minus_create(void);#ifdef __cplusplus}#endif#endif
productb.c
#include <stdio.h>#include <stdlib.h>#include <assert.h>#include "productb.h"#include "typedef.h"static Result *oper_minus_result(int a, int b){Result *result = malloc(sizeof(Result));if(result != NULL){result->val = a - b;}return result;}static void oper_minus_destroy(Minus *thiz){if(thiz != NULL){SAFE_FREE(thiz);}}Minus *oper_minus_create(void){Minus *thiz = malloc(sizeof(Minus));if(thiz != NULL){thiz->minus_result = oper_minus_result;thiz->minus_destroy = oper_minus_destroy;}return thiz;}
factory.h
#ifndef __FACTORY_H__#define __FACTORY_H__#include "product.h"#ifdef __cplusplusextern "C" {#endifstruct _Factory;typedef struct _Factory Factory;typedef Operation* (*CreateOperFunc)(char operName);typedef void (*FactoryDestroyFunc)(Factory *thiz);struct _Factory{CreateOperFunc create_oper;FactoryDestroyFunc destroy;};Factory *FactoryCreate(void);Operation* factory_create_oper(char operName);void factory_destroy(Factory *thiz);#ifdef __cplusplus}#endif#endif
factory.c
#include <stdio.h>#include <stdlib.h>#include <assert.h>#include "factory.h"#include "producta.h"#include "productb.h"Operation* factory_create_oper(char operName){Operation *thiz = malloc(sizeof(Operation));if(thiz != NULL){switch(operName){case '+':thiz = (Operation *)oper_add_create();break;case '-':thiz = (Operation *)oper_minus_create();break;default:;}}return thiz;}void factory_destroy(Factory *thiz){if(thiz!= NULL){SAFE_FREE(thiz);}return ;}Factory *FactoryCreate(void){Factory *thiz = malloc(sizeof(Factory));if(thiz != NULL){thiz->create_oper = factory_create_oper;thiz->destroy = factory_destroy;}}
test.c
#include <stdio.h>#include <stdlib.h>#include <assert.h>#include "factory.h"#include "product.h"int main(int argc, char **argv){Factory *factory = FactoryCreate();Operation *oper = factory_create_oper('+');Result* result = oper_result(oper, 3, 5);printf("%d\n", result->val);oper_destroy(oper);factory->destroy(factory);return 0;}
Makefile
exe:=testtemp := $(wildcard test *~) all:test.c factory.c factory.h product.h producta.c producta.h productb.c productb.h typedef.hgcc -g $^ -o $(exe)clean:rm $(temp)
【源码下载】
*欢迎纠错,共同进步!
转载请标明出处,仅供学习交流,勿用于商业目的
Copyright @ http://blog.csdn.net/tandesir
- 简单工厂模式C语言实现
- 简单工厂模式(C语言实现)
- C语言实现工厂模式
- 简单工厂模式(java语言实现)
- C语言实现设计模式之简单工厂模式(无内存泄露)
- 工厂方法模式C语言实现
- C语言实现抽象工厂模式实例
- 工厂函数模式 (C语言实现)
- 抽象工厂模式 (C语言实现)
- C#-简单工厂模式
- 【C#】简单工厂模式
- 【C#】简单工厂模式
- java语言实现创建型模式—简单工厂模式
- 实现简单工厂模式
- 工厂模式简单实现
- 简单实现工厂模式
- go语言快速入门:简单工厂模式的实现(23)
- Java, C#, JavaScript三种语言实现工厂模式
- SVN环境搭建
- linux 内核分析之链表解析(list_head)
- 数据库增改查
- linux vi命令用法
- 几个移动开发资源资源下载网站
- 简单工厂模式C语言实现
- 程序人生--2001年(8)
- 开始自己的java学习之路
- 简单选择排序
- 通过document.getElementsByName来实现 复选框的全选,全部选,反选
- 自动滚动相册小程序
- 创建一个book.xml文档,PHP通过DOM方式解析获得每本书的作者和书名
- 一个机器上同时安装有两个版本oracle时的pl/sql developer的设置
- harrtraining前将统一图片尺寸方法