设计模式 工厂模式 从卖肉夹馍说起


  1.  *  
  2.  * @author zhy 
  3.  *  
  4.  */  
  5. public class XianRouJiaMoStore extends RoujiaMoStore  
  6. {  
  7.   
  8.     @Override  
  9.     public RouJiaMo createRouJiaMo(String type)  
  10.     {  
  11.         RouJiaMo rouJiaMo = null;  
  12.         if (type.equals("Suan"))  
  13.         {  
  14.             rouJiaMo = new XianSuanRouJiaMo();  
  15.   
  16.         } else if (type.equals("Tian"))  
  17.         {  
  18.             rouJiaMo = new XianTianRouJiaMo();  
  19.         } else if (type.equals("La"))  
  20.         {  
  21.             rouJiaMo = new XianLaRouJiaMo();  
  22.         }  
  23.         return rouJiaMo;  
  24.   
  25.     }  
  26.   
  27. }  

然后就是各个西安口味的肉夹馍了,这代码就不贴了。可以看出我们把制作肉夹馍的过程以抽象方法的形式让子类去决定了,对照定义:

1、定义了创建对象的一个接口:public abstract RouJiaMo createRouJiaMo(String type);

2、由子类决定实例化的类,可以看到我们的馍是子类生成的。

可能有人会说,我用简单工厂模式也行啊,但是如果10来个城市*5种风味/城市,那么岂不是简单工厂里面需要50多个if,再说人家西安肉夹馍分店就不能有点自己的秘诀,当然由它自己定最好。

好了,方法工厂模式介绍完毕。

4、抽象工厂模式

定义:提供一个接口,用于创建相关的或依赖对象的家族,而不需要明确指定具体类。

这定义有点绕口,算了,还是拿例子来说。继续卖肉夹馍,咱们生意这么好,难免有些分店开始动歪脑子,开始使用劣质肉等,砸我们的品牌。所以我们要拿钱在每个城市建立自己的原料场,保证高质量原料的供应。

于是我们新建一个提供原料的接口:

[java] view plain copy
  1. package com.zhy.pattern.factory.b;  
  2.   
  3. /** 
  4.  * 提供肉夹馍的原料 
  5.  * @author zhy 
  6.  * 
  7.  */  
  8. public interface RouJiaMoYLFactroy  
  9. {  
  10.     /** 
  11.      * 生产肉 
  12.      * @return 
  13.      */  
  14.     public Meat createMeat();  
  15.       
  16.     /** 
  17.      * 生产调料神马的 
  18.      * @return 
  19.      */  
  20.     public YuanLiao createYuanliao();  
  21.       
  22. }  

[java] view plain copy
  1. package com.zhy.pattern.factory.b;  
  2.   
  3. /** 
  4.  * 根据西安当地特色,提供这两种材料 
  5.  * @author zhy 
  6.  * 
  7.  */  
  8. public class XianRouJiaMoYLFactroy implements RouJiaMoYLFactroy  
  9. {  
  10.   
  11.     @Override  
  12.     public Meat createMeat()  
  13.     {  
  14.         return new FreshMest();  
  15.     }  
  16.   
  17.     @Override  
  18.     public YuanLiao createYuanliao()  
  19.     {  
  20.         return new XianTeSeYuanliao();  
  21.     }  
  22.   
  23. }  

有了原理工厂,那我们稍微修改下RouJiaMo的prepare方法:
[java] view plain copy
  1. package com.zhy.pattern.factory.b;  
  2.   
  3. public abstract class RouJiaMo  
  4. {  
  5.     protected String name;  
  6.   
  7.     /** 
  8.      * 准备工作 
  9.      */  
  10.     public final void prepare(RouJiaMoYLFactroy ylFactroy)  
  11.     {  
  12.         Meat meat = ylFactroy.createMeat();  
  13.         YuanLiao yuanliao = ylFactroy.createYuanliao();  
  14.         System.out.println("使用官方的原料" + meat + " , " + yuanliao + "作为原材料制作肉夹馍 ");  
  15.     }  
  16.   
  17.     /** 
  18.      * 使用你们的专用袋-包装 
  19.      */  
  20.     public final void pack()  
  21.     {  
  22.         System.out.println("肉夹馍-专用袋-包装");  
  23.     }  
  24.   
  25.     /** 
  26.      * 秘制设备-烘烤2分钟 
  27.      */  
  28.     public final void fire()  
  29.     {  
  30.         System.out.println("肉夹馍-专用设备-烘烤");  
  31.     }  
  32. }  

好了,现在必须用我们官方原料做为原材料了。

现在对比定义:

1、提供一个接口:public interface RouJiaMoYLFactroy

2、用于创建相关的或依赖对象的家族 public Meat createMeat();public YuanLiao createYuanliao();我们接口用于创建一系列的原材料。

好了,最后测试下,我要在西安馍店,买个酸味的尝尝:

[java] view plain copy
  1. package com.zhy.pattern.factory.b;  
  2.   
  3.   
  4. public class Test  
  5. {  
  6.     public static void main(String[] args)  
  7.     {  
  8.           
  9.         RoujiaMoStore roujiaMoStore = new XianRouJiaMoStore();  
  10.         RouJiaMo suanRoujiaMo = roujiaMoStore.sellRouJiaMo("Suan");  
  11.         System.out.println(suanRoujiaMo.name);  
  12.     }  
  13. }  

[java] view plain copy
  1. 使用官方的原料com.zhy.pattern.factory.b.FreshMest@e53108 , com.zhy.pattern.factory.b.XianTeSeYuanliao@f62373作为原材料制作肉夹馍   
  2. 肉夹馍-专用设备-烘烤  
  3. 肉夹馍-专用袋-包装  
  4. 酸味肉夹馍  

哈哈~肉夹馍店的已经建立起来了,兄弟们卖馍去把~记得留个言,给个赞~


你可能感兴趣的:(设计模式,工厂模式,从卖肉夹馍说起)