返回

C语言和设计模式(抽象工厂模式)

发布时间:2023-09-18 00:07:41 162


    前面我们写过的工厂模式实际上是对产品的抽象。对于不同的用户需求,我们可以给予不同的产品,而且这些产品的接口都是一致的。而抽象工厂呢?顾名思义,就是说我们的工厂是不一定的。怎么理解呢,举个例子。

    假设有两个水果店都在卖水果,都卖苹果和葡萄。其中一个水果店买白苹果和白葡萄,另外一个水果店卖红苹果和红葡萄。所以说,对于水果店而言,尽管都在卖水果,但是两个店卖的品种不一样。  

    既然水果不一样,那我们先定义水果。

typedef struct _Apple
{
void (*print_apple)();
}Apple;

typedef struct _Grape
{
void (*print_grape)();
}Grape;

    上面分别对苹果和葡萄进行了抽象,当然它们的具体函数也是不一样的。

void print_white_apple()
{
printf("white apple!\n");
}

void print_red_apple()
{
printf("red apple!\n");
}

void print_white_grape()
{
printf("white grape!\n");
}

void print_red_grape()
{
printf("red grape!\n");
}

    完成了水果函数的定义。下面就该定义工厂了,和水果一样,我们也需要对工厂进行抽象处理。

typedef struct _FruitShop
{
Apple* (*sell_apple)();
Apple* (*sell_grape)();
}FruitShop;

    所以,对于卖白苹果、白葡萄的水果店就该这样设计了,红苹果、红葡萄的水果店亦是如此。

Apple* sell_white_apple()
{
Apple* pApple = (Apple*) malloc(sizeof(Apple));
assert(NULL != pApple);

pApple->print_apple = print_white_apple;
return pApple;
}

Grape* sell_white_grape()
{
Grape* pGrape = (Grape*) malloc(sizeof(Grape));
assert(NULL != pGrape);

pGrape->print_grape = print_white_grape;
return pGrape;
}

    这样,基本的框架就算搭建完成的,以后创建工厂的时候,

FruitShop* create_fruit_shop(int color)
{
FruitShop* pFruitShop = (FruitShop*) malloc(sizeof(FruitShop));
assert(NULL != pFruitShop);

if(WHITE == color)
{
pFruitShop->sell_apple = sell_white_apple;
pFruitShop->sell_grape = sell_white_grape;
}
else
{
pFruitShop->sell_apple = sell_red_apple;
pFruitShop->sell_grape = sell_red_grape;
}

return pFruitShop;
}



特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(0)
按点赞数排序
用户头像
精选文章
thumb 中国研究员首次曝光美国国安局顶级后门—“方程式组织”
thumb 俄乌线上战争,网络攻击弥漫着数字硝烟
thumb 从网络安全角度了解俄罗斯入侵乌克兰的相关事件时间线
下一篇
C语言和设计模式(之原型模式) 2023-09-17 21:03:52