求知 文章 文库 Lib 视频 Code iProcess 课程 认证 咨询 工具 火云堂 讲座吧   成长之路  
会员   
要资料
 
追随技术信仰

随时听讲座
每天看新闻
 
 

C语言和设计模式 教程
开篇
单件模式
原型模式
组合模式
模板模式
工厂模式
责任链模式
抽象工厂模式
迭代器模式
外观模式
代理模式
享元模式
装饰模式
适配器模式
策略模式
中介者模式
建造者模式
桥接模式
观察者模式
备忘录模式
解释器模式
命令模式
状态模式
访问者模式
继承、封装、多态
 
 

抽象工厂模式
56 次浏览
11次  
 捐助

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

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

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

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;
}

 


您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码: 验证码,看不清楚?请点击刷新验证码 必填



56 次浏览
11次
 捐助
 

每天2个文档/视频
扫描微信二维码订阅
订阅技术月刊
获得每月300个技术资源
 
 

关于我们 | 联系我们 | 京ICP备10020922号 京公海网安备110108001071号