工厂设计模式(C语言版)
现在有个皮包公司,这个公司只要你给他水果名字,他就能告诉你颜色,形状,生产地....等信息(没列出来的自己加);对于客户 来说,我们也不需要
现在有个皮包公司,这个公司只要你给他水果名字,他就能告诉你颜色,形状,生产地....等信息(没列出来的自己加);对于客户 来说,我们也不需要知道他们怎么回去颜色,生产地信息的(是GPT告诉他的,还是花钱问路人的,咱们不管)。只需要告诉工厂,我要知道某某水果某某特性,你告诉我一下。
对于,工厂设计模式理论不是很理解的,可以参考一下链接:https://www.runoob.com/design-pattern/factory-pattern.html
废话不多说,参照上图,设计出来的工厂模式,示例中为了扩展性,美观性,做了一些更改。咱们从图中,从下往上一步一步实现,真实的开发中,也是这思路:首先明确你要什么,苹果的种植方法,还是苹果的颜色,或者是你是要苹果还是香蕉,有了这个目标才一步一步实现的。
首先建立苹果
//apple.hn#ifndef __APPLE_Hn#define __APPLE_Hn#include "public.h"napi_methord_st apple_methord;nvoid apple_methord_init(void);n#endifnnn//apple.cn#include "apple.h"n/******************apple**************/nnint apple_get_color(void)n{ntprintf("nttapple_get_colorn");ntreturn E_OK;n}nint apple_get_origin(char * data)n{ntif(NULL == data){nttreturn E_err_ptr;nt}ntntprintf("nttapple_get_origin:[%s]n", data);ntreturn E_OK;n}nint apple_get_shape(void)n{ntprintf("nttapple_get_shapen");ntreturn E_OK;n}nnvoid apple_methord_init(void)n{ntapple_methord.get_color = apple_get_color;nntapple_methord.get_origin = apple_get_origin;nntapple_methord.get_shape = apple_get_shape;n}n/***************************************************/
然后建立香蕉
//banana.hn#ifndef __BANANA_Hn#define __BANANA_Hn#include "public.h"napi_methord_st banana_methord;nvoid banana_methord_init(void);n#endifnnn//banana.cn#include "banana.h"n/****************banana*********************/nnint banana_get_color(void)n{ntprintf("nttbanana_get_colorn");ntreturn E_OK;n}nint banana_get_origin(char * data)n{ntif(NULL == data){nttreturn E_err_ptr;nt}ntntprintf("nttbanana_get_origin:[%s]n", data);ntreturn E_OK;n}nint banana_get_shape(void)n{ntprintf("nttbanana_get_shapen");ntreturn E_OK;n}nvoid banana_methord_init(void)n{ntbanana_methord.get_color = banana_get_color;ntntbanana_methord.get_origin = banana_get_origin;nntbanana_methord.get_shape = banana_get_shape;n}n/***************************************************/n
//剩下的西瓜 ,芒果,请自行添加,都是一样的额。可以看到,咱们后面如果有新的产品,其实都是一样的方法添加就可以了。
//public.hn#include"stdio.h"n#ifndef __PUBLIC_Hn#define __PUBLIC_Hnenum ErrCode {ntE_OK,ntE_err,ntE_err_ptr,ntE_MAX,n};nn//具体某个子工厂可以做哪些事情ntypedef struct zjiang_fruit_fun_api_methord_stn{ntint (*get_color)(void);ntint (*get_origin)(char* data);ntint (*get_shape)(void);ntint (*get_production_steps)(void);n}api_methord_st;nn#endifnnnn//main.hn#ifndef __MAIN_Hn#define __MAIN_Hn#include "banana.h"n#include "apple.h"nntypedef enum e_fruiType {ntFRUIT_BANANA=0,ntFRUIT_APPLE=1,ntFRUIT_WATERMELON=2,ntFRUIT_MAX,n}fruiType;nntypedef struct s_fruitFactory {ntint type;ntapi_methord_st* method;ntvoid (*init)(void);n}fruitFactory_t;nnfruitFactory_t zjiangFruit[]={nnt//bananant{ntt/*fruit_type*/FRUIT_BANANA,ntt/*method*/&banana_methord,ntt/*init*/banana_methord_init,nt},nnt//applent{ntt/*fruit_type*/FRUIT_APPLE,ntt/*method*/&apple_methord,ntt/*init*/apple_methord_init,nt},nnt//WATERMELONtttttttttttttttttn};n#endifnnnn//main.cn#include "main.h"nint zjiang_get_spec(fruiType fruiType, void** method)n{ntint nFruitSize = 0;ntif (fruiType >= FRUIT_MAX) {nttreturn E_err;nt}ntif (NULL == method) {nttreturn E_err_ptr;nt}nntnFruitSize = (sizeof(zjiangFruit) / sizeof(fruitFactory_t));tntif (fruiType >= nFruitSize){ntt//array subscripts start at 0nttprintf("%s:%d get fruiType:%d spec fail:%d!n", __FUNCTION__, __LINE__, fruiType, nFruitSize);nttreturn E_err;nt}nntzjiangFruit[fruiType].init();nt(*method) = zjiangFruit[fruiType].method;ntreturn E_OK;n}nn//具体方法nint zjiang_get_fruit_color(fruiType fruit_type)n{ntint ret = E_OK;ntvoid* pmethod = NULL;ntapi_methord_st* api_method = NULL;nntret = zjiang_get_spec(fruit_type, &pmethod);ntif (E_OK != ret) {nttprintf("%s:%d get spec fail!n", __FUNCTION__, __LINE__);nttreturn ret;nt}ntapi_method = (api_methord_st*)pmethod;nntif (NULL != api_method){nttif (NULL != api_method->get_color){ntttapi_method->get_color();ntt}nt}ntelse{nttprintf("%s:%d api_method is nulln", __FUNCTION__, __LINE__);nt}nntreturn E_OK;n}nnint zjiang_get_fruit_origin(fruiType fruit_type, char * data)n{ntint ret = E_OK;ntvoid* pmethod = NULL;ntapi_methord_st* api_method = NULL;nntret = zjiang_get_spec(fruit_type, &pmethod);ntif (E_OK != ret) {nttprintf("%s:%d get spec fail!n", __FUNCTION__, __LINE__);nttreturn ret;nt}ntapi_method = (api_methord_st*)pmethod;nntif (NULL != api_method) {nttif (NULL != api_method->get_origin) {ntttapi_method->get_origin(data);ntt}nt}ntelse {nttprintf("%s:%d api_method is nulln", __FUNCTION__, __LINE__);nt}nntreturn E_OK;n}nnint main()n{ntzjiang_get_fruit_color(FRUIT_WATERMELON);ntzjiang_get_fruit_color(FRUIT_BANANA);ntzjiang_get_fruit_color(FRUIT_APPLE);ntzjiang_get_fruit_origin(FRUIT_BANANA, "hangzhou");ntzjiang_get_fruit_origin(FRUIT_APPLE, "jiangnan");nt//zjiang_get_fruit_color(FRUIT_MAX);ntprintf("hello word!n");ntreturn 0;nn}n
以上代码亲测可用。运行结果如下:
完整代码:
https://github.com/lordZhouJ/factory_design_mode.git下一节:
哈曼哈龟:单例设计模式(C语言版)上一篇:淘工厂
下一篇:大力建设好乡村加油站