锅炉信息网 > 锅炉知识 > 锅炉百科

工厂设计模式(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语言版)

上一篇:淘工厂

下一篇:大力建设好乡村加油站

精选推荐

  • 711关东煮供应商
    711关东煮供应商

    今天给大家介绍三位,奶粉,全家、罗森这些便利店里关东煮的供应商。店里卖三四块钱一串的关东煮,在网上买不到,一块钱就搞定。首先关东

  • 健康日历|高压锅容易爆炸的4个原因
    健康日历|高压锅容易爆炸的4个原因

    来源:医药养生保健报设计:李雅琴医学审核:姜峰出品人:胡丽丽

  • 高炉
    高炉

    今天这活却是个白事,等到了时辰,那家人便准备火化,本来准备送普炉,我却心中一动,便对那家人说道:“这老人走也不要省,还是送高炉吧。”

  • 高压锅和电压力锅的区别,推荐几款点压力锅
    高压锅和电压力锅的区别,推荐几款点压

    记得之前有一次去朋友家玩,他正在用高压锅煮小米粥,是的,高压锅压小米粥,大概煮了半小时,高压锅突然爆炸了,现场惨不忍睹啊,幸好厨房里没

0