转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/24460585

今天继续设计模式之旅,给大家带来工厂模式,简单列一下这个模式的家族:

1、静态工厂模式

2、简单工厂模式

3、工厂方法模式

4、抽象工厂模式

是不是觉得,我勒个去,这工厂还能列出这么多分类,哈哈,下面开始各个击破。

1、静态工厂模式

这个最常见了,项目中的辅助类,TextUtil.isEmpty等,类+静态方法。下面开始详细介绍:略。

2、简单工厂模式

下面开始谈谈卖肉夹馍,最近程序员卖肉夹馍很火,啥时候大牛们都去卖了,我等就崛起了,哈哈。

首先你得有个店:RoujiaMoStore

package com.zhy.pattern.factory.a;public class RoujiaMoStore
{/*** 根据传入类型卖不同的肉夹馍* * @param type* @return*/public RouJiaMo sellRouJiaMo(String type){RouJiaMo rouJiaMo = null;if (type.equals("Suan")){rouJiaMo = new SuanRouJiaMo();} else if (type.equals("Tian")){rouJiaMo = new TianRouJiaMo();} else if (type.equals("La")){rouJiaMo = new LaRouJiaMo();}rouJiaMo.prepare();rouJiaMo.fire();rouJiaMo.pack();return rouJiaMo;}}

然后你得有各种风味的馍馍:

package com.zhy.pattern.factory.a;public abstract class RouJiaMo
{protected String name;/*** 准备工作*/public void prepare(){System.out.println("揉面-剁肉-完成准备工作");}/*** 使用你们的专用袋-包装*/public void pack(){System.out.println("肉夹馍-专用袋-包装");}/*** 秘制设备-烘烤2分钟*/public void fire(){System.out.println("肉夹馍-专用设备-烘烤");}
}
package com.zhy.pattern.factory.a;import com.zhy.pattern.factory.a.RouJiaMo;/*** 辣味肉夹馍* * @author zhy* */
public class LaRouJiaMo extends RouJiaMo
{public LaRouJiaMo(){this.name = "辣味肉夹馍";}
}
package com.zhy.pattern.factory.a;/*** 酸味肉夹馍* * @author zhy* */
public class SuanRouJiaMo extends RouJiaMo
{public SuanRouJiaMo(){this.name = "酸味肉夹馍";}
}
package com.zhy.pattern.factory.a;/*** 酸味肉夹馍* * @author zhy* */
public class SuanRouJiaMo extends RouJiaMo
{public SuanRouJiaMo(){this.name = "酸味肉夹馍";}
}

现在这样的设计,虽然可以支持你卖肉夹馍了,但是有点问题,生产馍的种类和你的RoujiaMoStore耦合度太高了,如果增加几种风味,删除几种风味,你得一直修改sellRouJiaMo中的方法,所以我们需要做一定的修改,此时简单工厂模式就能派上用场了。

我们开始写个简单工厂,把产生馍的过程拿出来:

package com.zhy.pattern.factory.a;public class SimpleRouJiaMoFactroy
{public RouJiaMo createRouJiaMo(String type){RouJiaMo rouJiaMo = null;if (type.equals("Suan")){rouJiaMo = new SuanRouJiaMo();} else if (type.equals("Tian")){rouJiaMo = new TianRouJiaMo();} else if (type.equals("La")){rouJiaMo = new LaRouJiaMo();}return rouJiaMo;}}

然后以组合的方式,让Store来使用:

package com.zhy.pattern.factory.a;public class RoujiaMoStore
{private SimpleRouJiaMoFactroy factroy;public RoujiaMoStore(SimpleRouJiaMoFactroy factroy){this.factroy = factroy;}/*** 根据传入类型卖不同的肉夹馍* * @param type* @return*/public RouJiaMo sellRouJiaMo(String type){RouJiaMo rouJiaMo = factroy.createRouJiaMo(type);rouJiaMo.prepare();rouJiaMo.fire();rouJiaMo.pack();return rouJiaMo;}}

好了,现在你随便添加什么种类的馍,删除什么种类的馍就和Store无关了,就是么~人家只负责卖馍么~ 这就是简单工厂模式,当然了,大家也都比较熟悉。

3、工厂方法模式

定义:定义一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法模式把类实例化的过程推迟到子类。

好了,看完定义,下面我们用例子来展示。继续肉夹馍,由于使用了简单工厂模式,肉夹馍生意那个好啊,所以下载决定去西安开个分店,去北京开个分店。既然有分店了,那总店就是抽象的了:

package com.zhy.pattern.factory.b;public abstract class RoujiaMoStore
{public abstract RouJiaMo createRouJiaMo(String type);/*** 根据传入类型卖不同的肉夹馍* * @param type* @return*/public RouJiaMo sellRouJiaMo(String type){RouJiaMo rouJiaMo = createRouJiaMo(type);rouJiaMo.prepare();rouJiaMo.fire();rouJiaMo.pack();return rouJiaMo;}}

然后在开两个分店,这里拿一个代码做演示,其他都一样:

package com.zhy.pattern.factory.b;/*** 西安肉夹馍店* * @author zhy* */
public class XianRouJiaMoStore extends RoujiaMoStore
{@Overridepublic RouJiaMo createRouJiaMo(String type){RouJiaMo rouJiaMo = null;if (type.equals("Suan")){rouJiaMo = new XianSuanRouJiaMo();} else if (type.equals("Tian")){rouJiaMo = new XianTianRouJiaMo();} else if (type.equals("La")){rouJiaMo = new XianLaRouJiaMo();}return rouJiaMo;}}

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

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

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

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

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

4、抽象工厂模式

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

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

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

package com.zhy.pattern.factory.b;/*** 提供肉夹馍的原料* @author zhy**/
public interface RouJiaMoYLFactroy
{/*** 生产肉* @return*/public Meat createMeat();/*** 生产调料神马的* @return*/public YuanLiao createYuanliao();}
package com.zhy.pattern.factory.b;/*** 根据西安当地特色,提供这两种材料* @author zhy**/
public class XianRouJiaMoYLFactroy implements RouJiaMoYLFactroy
{@Overridepublic Meat createMeat(){return new FreshMest();}@Overridepublic YuanLiao createYuanliao(){return new XianTeSeYuanliao();}}

有了原理工厂,那我们稍微修改下RouJiaMo的prepare方法:

package com.zhy.pattern.factory.b;public abstract class RouJiaMo
{protected String name;/*** 准备工作*/public final void prepare(RouJiaMoYLFactroy ylFactroy){Meat meat = ylFactroy.createMeat();YuanLiao yuanliao = ylFactroy.createYuanliao();System.out.println("使用官方的原料" + meat + " , " + yuanliao + "作为原材料制作肉夹馍 ");}/*** 使用你们的专用袋-包装*/public final void pack(){System.out.println("肉夹馍-专用袋-包装");}/*** 秘制设备-烘烤2分钟*/public final void fire(){System.out.println("肉夹馍-专用设备-烘烤");}
}

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

现在对比定义:

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

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

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

package com.zhy.pattern.factory.b;public class Test
{public static void main(String[] args){RoujiaMoStore roujiaMoStore = new XianRouJiaMoStore();RouJiaMo suanRoujiaMo = roujiaMoStore.sellRouJiaMo("Suan");System.out.println(suanRoujiaMo.name);}
}
使用官方的原料com.zhy.pattern.factory.b.FreshMest@e53108 , com.zhy.pattern.factory.b.XianTeSeYuanliao@f62373作为原材料制作肉夹馍
肉夹馍-专用设备-烘烤
肉夹馍-专用袋-包装
酸味肉夹馍

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

设计模式 工厂模式 从卖肉夹馍说起相关推荐

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

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/24460585 今天继续设计模式之旅,给大家带来工厂模式,简单列一下这个模式的家族 ...

  2. Java设计模式-工厂模式(3)抽象工厂模式

    在Java设计模式-工厂模式(2)工厂方法模式 我们知道了工厂方法模式解决了简单工厂模式中的缺陷,做到了满足开闭原则,但是时代是进步的,进而又产生新的问题,工厂难道只能生产一种东西吗.我们所见到的工厂 ...

  3. Java设计模式-工厂模式(2)工厂方法模式

    在Java设计模式-工厂模式(1)简单工厂模式 中我们介绍了简单工厂模式,提到了简单工厂模式违背了开闭原则,而"工厂方法模式"是对简单工厂模式的进一步抽象化,其好处是可以使系统在不 ...

  4. Java设计模式-工厂模式(1)简单工厂模式

    Java设计模式-工厂模式(1)简单工厂模式 一.前言 1)例子 2)类图关系 3)代码实现 二.简单工厂模式 2.1.概述: 2.2.类图关系: 2.3.代码修改: 2.4.优缺点 2.5.扩展-简 ...

  5. 设计模式---工厂模式

    设计模式---工厂模式 工厂方法模式 概述:工厂方法模式中抽象工厂负责定义创建对象的接口,具体创建工作由继承抽象工厂的具体类实现. 优点:客户端不需要再负责对象的创建,从而明确了各个类的职责,如果有新 ...

  6. java设计模式工厂模式_Java中的工厂设计模式

    java设计模式工厂模式 Welcome to the Factory Design Pattern in Java tutorial. Factory Pattern is one of the C ...

  7. java设计模式工厂模式_Java中的复合设计模式

    java设计模式工厂模式 Composite pattern is one of the Structural design pattern. Composite design pattern is ...

  8. java设计模式工厂模式_Java中的桥梁设计模式

    java设计模式工厂模式 Today we will look into Bridge Design Pattern in java. When we have interface hierarchi ...

  9. java设计模式工厂模式_Java中的外观设计模式

    java设计模式工厂模式 Facade Design Pattern is one of the Structural design patterns (such as Adapter pattern ...

最新文章

  1. Linux查看进程的线程信息
  2. 查看有多少个linux用户登录,Linux用户查看系统有多少用户在登录
  3. MySQL数据库的终结_MySQL数据库秘籍终结 对不起了 让你们自宫了 其实不消哈哈哈...
  4. 获取radio和select的值,获取select的值
  5. springmvc前后端传值总结
  6. 树莓派安装qq linux,在树莓派上安装Ubuntu Core
  7. dialogArguments的用法
  8. 中国省份地级市政区图大全
  9. LPDDR4协议规范之(二)复位和上电初始化
  10. HTML基础之表单提交
  11. 企业所得税汇总纳税信息报告网上办理操作指南
  12. ISTQB TM考点总结
  13. 常用图形渲染API简介
  14. 网络协议分析(3):FTP
  15. 字符串操作,截取最后一个逗号
  16. ES与传统数据库,为什么用ES?
  17. 谈谈单元测试:为什么要进行单元测试?
  18. 川崎机器人f控制柜接线图_川崎机器人PROFINET总线通信图文教程
  19. SaaS软件建立平台生态的挑战
  20. 如何查询ip地址和端口号

热门文章

  1. vue+Echarts实现圆柱体柱状图
  2. 燃气灶电子点火器原理与检修(图)
  3. 拆书帮第14期训练营——作业六:第一周复盘
  4. 微信小程序:动态控制class属性
  5. PCA与ICA的介绍
  6. 化妆刷和工具的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  7. 微信小程序本地调试时图标闪烁问题
  8. 火狐浏览器提示cors未能成功(完美解决)
  9. NeurIPS 2022 | 谷歌用贝叶斯优化做巧克力曲奇!还跟自家食堂签了约...
  10. [转载] 今天看新闻,说云南昆明ATM机取400元吐出4000 ,银行吁市民还钱。。。