设计模式 工厂模式
2015-09-16 20:29
281 查看
工厂模式,简单列一下这个模式的家族:
1、静态工厂模式
2、简单工厂模式
3、工厂方法模式
4、抽象工厂模式
是不是觉得,我勒个去,这工厂还能列出这么多分类,哈哈,下面开始各个击破。
1、静态工厂模式
这个最常见了,项目中的辅助类,TextUtil.isEmpty等,类+静态方法。下面开始详细介绍:略。
2、简单工厂模式
下面开始谈谈卖肉夹馍,最近程序员卖肉夹馍很火,啥时候大牛们都去卖了,我等就崛起了,哈哈。
首先你得有个店:RoujiaMoStore
}
[/code]
然后你得有各种风味的馍馍:
}
[/code]
现在这样的设计,虽然可以支持你卖肉夹馍了,但是有点问题,生产馍的种类和你的RoujiaMoStore耦合度太高了,如果增加几种风味,删除几种风味,你得一直修改sellRouJiaMo中的方法,所以我们需要做一定的修改,此时简单工厂模式就能派上用场了。
我们开始写个简单工厂,把产生馍的过程拿出来:
}
[/code]
然后以组合的方式,让Store来使用:
}
[/code]
好了,现在你随便添加什么种类的馍,删除什么种类的馍就和Store无关了,就是么~人家只负责卖馍么~ 这就是简单工厂模式,当然了,大家也都比较熟悉。
3、工厂方法模式
定义:定义一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法模式把类实例化的过程推迟到子类。
好了,看完定义,下面我们用例子来展示。继续肉夹馍,由于使用了简单工厂模式,肉夹馍生意那个好啊,所以下载决定去西安开个分店,去北京开个分店。既然有分店了,那总店就是抽象的了:
}
[/code]
然后在开两个分店,这里拿一个代码做演示,其他都一样:
}
[/code]
然后就是各个西安口味的肉夹馍了,这代码就不贴了。可以看出我们把***肉夹馍的过程以抽象方法的形式让子类去决定了,对照定义:
1、定义了创建对象的一个接口:public abstract RouJiaMo createRouJiaMo(String type);
2、由子类决定实例化的类,可以看到我们的馍是子类生成的。
可能有人会说,我用简单工厂模式也行啊,但是如果10来个城市*5种风味/城市,那么岂不是简单工厂里面需要50多个if,再说人家西安肉夹馍分店就不能有点自己的秘诀,当然由它自己定最好。
好了,方法工厂模式介绍完毕。
4、抽象工厂模式
定义:提供一个接口,用于创建相关的或依赖对象的家族,而不需要明确指定具体类。
这定义有点绕口,算了,还是拿例子来说。继续卖肉夹馍,咱们生意这么好,难免有些分店开始动歪脑子,开始使用劣质肉等,砸我们的品牌。所以我们要拿钱在每个城市建立自己的原料场,保证高质量原料的供应。
于是我们新建一个提供原料的接口:
}
[/code]
}
[/code]
有了原理工厂,那我们稍微修改下RouJiaMo的prepare方法:
}
[/code]
好了,现在必须用我们官方原料做为原材料了。
现在对比定义:
1、提供一个接口:public interface RouJiaMoYLFactroy
2、用于创建相关的或依赖对象的家族 public Meat createMeat();public YuanLiao createYuanliao();我们接口用于创建一系列的原材料。
好了,最后测试下,我要在西安馍店,买个酸味的尝尝:
}
[/code]
转自 鸿洋大神 Blog /article/1380410.html
1、静态工厂模式
2、简单工厂模式
3、工厂方法模式
4、抽象工厂模式
是不是觉得,我勒个去,这工厂还能列出这么多分类,哈哈,下面开始各个击破。
1、静态工厂模式
这个最常见了,项目中的辅助类,TextUtil.isEmpty等,类+静态方法。下面开始详细介绍:略。
2、简单工厂模式
下面开始谈谈卖肉夹馍,最近程序员卖肉夹馍很火,啥时候大牛们都去卖了,我等就崛起了,哈哈。
首先你得有个店:RoujiaMoStore
package com.zhy.pattern.factory.a; public class RoujiaMoStore { [code]/** * 根据传入类型卖不同的肉夹馍 * * @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; }
}
[/code]
然后你得有各种风味的馍馍:
package com.zhy.pattern.factory.a; public abstract class RouJiaMo { protected String name; [code]/** * 准备工作 */ public void prepare() { System.out.println("揉面-剁肉-完成准备工作"); } /** * 使用你们的专用袋-包装 */ public void pack() { System.out.println("肉夹馍-专用袋-包装"); } /** * 秘制设备-烘烤2分钟 */ public void fire() { System.out.println("肉夹馍-专用设备-烘烤"); }
}
[/code]
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(); [code] } else if (type.equals("Tian")) { rouJiaMo = new TianRouJiaMo(); } else if (type.equals("La")) { rouJiaMo = new LaRouJiaMo(); } return rouJiaMo; }
}
[/code]
然后以组合的方式,让Store来使用:
package com.zhy.pattern.factory.a; public class RoujiaMoStore { private SimpleRouJiaMoFactroy factroy; [code]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; }
}
[/code]
好了,现在你随便添加什么种类的馍,删除什么种类的馍就和Store无关了,就是么~人家只负责卖馍么~ 这就是简单工厂模式,当然了,大家也都比较熟悉。
3、工厂方法模式
定义:定义一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法模式把类实例化的过程推迟到子类。
好了,看完定义,下面我们用例子来展示。继续肉夹馍,由于使用了简单工厂模式,肉夹馍生意那个好啊,所以下载决定去西安开个分店,去北京开个分店。既然有分店了,那总店就是抽象的了:
package com.zhy.pattern.factory.b; public abstract class RoujiaMoStore { [code]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; }
}
[/code]
然后在开两个分店,这里拿一个代码做演示,其他都一样:
package com.zhy.pattern.factory.b; /** * 西安肉夹馍店 * * @author zhy * */ public class XianRouJiaMoStore extends RoujiaMoStore { [code]@Override public 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; }
}
[/code]
然后就是各个西安口味的肉夹馍了,这代码就不贴了。可以看出我们把***肉夹馍的过程以抽象方法的形式让子类去决定了,对照定义:
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(); [code]/** * 生产调料神马的 * @return */ public YuanLiao createYuanliao();
}
[/code]
package com.zhy.pattern.factory.b; /** * 根据西安当地特色,提供这两种材料 * @author zhy * */ public class XianRouJiaMoYLFactroy implements RouJiaMoYLFactroy { [code]@Override public Meat createMeat() { return new FreshMest(); } @Override public YuanLiao createYuanliao() { return new XianTeSeYuanliao(); }
}
[/code]
有了原理工厂,那我们稍微修改下RouJiaMo的prepare方法:
package com.zhy.pattern.factory.b; public abstract class RouJiaMo { protected String name; [code]/** * 准备工作 */ 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("肉夹馍-专用设备-烘烤"); }
}
[/code]
好了,现在必须用我们官方原料做为原材料了。
现在对比定义:
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) { [code] RoujiaMoStore roujiaMoStore = new XianRouJiaMoStore(); RouJiaMo suanRoujiaMo = roujiaMoStore.sellRouJiaMo("Suan"); System.out.println(suanRoujiaMo.name); }
}
[/code]
使用官方的原料com.zhy.pattern.factory.b.FreshMest@e53108 , com.zhy.pattern.factory.b.XianTeSeYuanliao@f62373作为原材料***肉夹馍 肉夹馍-专用设备-烘烤 肉夹馍-专用袋-包装 酸味肉夹馍
转自 鸿洋大神 Blog /article/1380410.html
相关文章推荐
- @ 小浩
- 猫猫学iOS 之微博项目实战(10)微博cell中图片的显示以及各种填充模式简介
- Java库使用----xstream1.3.1
- android学习:android Activity生命周期的七个方法测试
- 如何撰写商业计划书(精简)
- socket编程原理
- WebService之Axis2系列教程Axis2与Spring集成发布
- USACO Section 1.4 More Search Technique
- Radar Installation (贪心+数学 不错的题 )
- Count and Say
- 短信发送
- 设计模式 装饰者模式
- [家里蹲大学数学杂志]第418期南开大学2013年实变函数期末考试试题参考解答
- Very simple problem - SGU 111(大数开方)
- Linux的SOCKET编程详解
- LNMP之memcached实现tomcat群集(三)
- c语言命名空间,cin.get().cin.getline()
- 开源框架DBUtil的使用以及使用Threadlocal类控制事务案例
- ListView--QQ联系人样式
- UIWindow