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

【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】

 

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

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

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

  1. typedef struct _Apple  
  2. {  
  3.     void (*print_apple)();  
  4. }Apple;  
  5.   
  6. typedef struct _Grape  
  7. {  
  8.     void (*print_grape)();  
  9. }Grape;   

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

  1. void print_white_apple()  
  2. {  
  3.     printf("white apple!\n");  
  4. }  
  5.   
  6. void print_red_apple()  
  7. {  
  8.     printf("red apple!\n");  
  9. }  
  10.   
  11. void print_white_grape()  
  12. {  
  13.     printf("white grape!\n");  
  14. }  
  15.   
  16. void print_red_grape()  
  17. {  
  18.     printf("red grape!\n");  
  19. }  

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

  1. typedef struct _FruitShop  
  2. {  
  3.     Apple* (*sell_apple)();  
  4.     Apple* (*sell_grape)();  
  5. }FruitShop;  

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

  1. Apple* sell_white_apple()  
  2. {  
  3.     Apple* pApple = (Apple*) malloc(sizeof(Apple));  
  4.     assert(NULL != pApple);  
  5.   
  6.     pApple->print_apple = print_white_apple;  
  7.     return pApple;  
  8. }  
  9.   
  10. Grape* sell_white_grape()  
  11. {  
  12.     Grape* pGrape = (Grape*) malloc(sizeof(Grape));  
  13.     assert(NULL != pGrape);  
  14.   
  15.     pGrape->print_grape = print_white_grape;  
  16.     return pGrape;  
  17. }   

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

  1. FruitShop* create_fruit_shop(int color)  
  2. {  
  3.     FruitShop* pFruitShop = (FruitShop*) malloc(sizeof(FruitShop));  
  4.     assert(NULL != pFruitShop);  
  5.   
  6.     if(WHITE == color)  
  7.     {  
  8.         pFruitShop->sell_apple = sell_white_apple;  
  9.         pFruitShop->sell_grape = sell_white_grape;  
  10.     }  
  11.     else  
  12.     {  
  13.         pFruitShop->sell_apple = sell_red_apple;  
  14.         pFruitShop->sell_grape = sell_red_grape;  
  15.     }  
  16.   
  17.     return pFruitShop;  

posted @ 2012-01-18 12:26  董雨  阅读(681)  评论(0编辑  收藏  举报