工厂 > 简单工厂
来源:互联网 发布:it行业怎么学 编辑:程序博客网 时间:2024/04/28 13:58
简单工厂其实不是一个设计模式,反而比较像一种编程习惯。
简单工厂就是把各种类型的实例的创建封装在“工厂”里,使用者作为工厂的客户,不需要自己创建实例,只需要使用工厂提供的接口获得即可。
以《Head First设计模式》中的预定Pizza场景为例。先来看一下工厂的产品:Pizza实体类
/** * 工厂的抽象产品类Pizza,包含所有类型Pizza公共的内容 */public abstract class Pizza { public void bake() { System.out.println("bake..."); } public void cut() { System.out.println("cut..."); }}
产生Pizza的简单工厂定义:
/** *@Description:简单工厂 */public class SimplePizzaFactory { public Pizza createPizza(String type) { if ("cheese".equals(type)) { return new CheesePizza(); } else if ("clam".equals(type)) { return new ClamPizza(); } else if ("veggie".equals(type)) { return new VeggiePizza(); } return null; }}
这里有一个常见的技巧:把createPizza定义为static类型,好处是不需要通过实例化SimplePizzaFactory的方式调用createPizza方法,缺点是不能通过继承来改变创建方法的行为。
这里createPizza方法接收的参数是String类型,其实使用提前定义好的常量或者enum枚举类型更好一些。看一个使用枚举的示例:
public enum ExcelExportTemplate { lotBuyExcel(1, "海外基金购买份额模板"), lotRansomExcel(2, "海外基金赎回份额模板"); public int value; public String desc; private ExcelExportTemplate(int value, String desc) { this.value = value; this.desc = desc; }}
使用这个枚举的工厂示例:
public class ExcelExportMapFactory { public static LinkedHashMap<String,ExcelColumn> createExcelMap(ExcelExportTemplate template){ LinkedHashMap<String,ExcelColumn> map = null; //海外基金购买份额模板 if(ExcelExportTemplate.lotBuyExcel == template){ ... } //海外基金赎回份额模板 else if(ExcelExportTemplate.lotRansomExcel == template){ ... } return map; }}
再回到订购Pizza的场景中,看一下Pizza工厂的客户–Pizza商店
package factory.simplefactory;/** *@Description:工厂的客户 - Pizza商店 *@Author:tony *@Since:2016年2月24日 */public class PizzaStore { SimplePizzaFactory factory; public PizzaStore(SimplePizzaFactory factory){ this.factory = factory; } public Pizza orderPizza(String type){ Pizza pizza = factory.createPizza(type); pizza.bake(); pizza.cut(); return pizza; }}
使用场景: 预定Pizza
package factory.simplefactory;public class SimpleFactoryTest { public static void main(String[] args) { SimplePizzaFactory factory = new SimplePizzaFactory(); PizzaStore store = new PizzaStore(factory); store.orderPizza("cheese"); }}
在整个预定Pizza的流程(orderPizza方法)中,只有制作具体的Pizza实例是变化的,其余的像烘烤和切割流程都是不变的,把变化的部分从中剥离出来,封装为简单工厂根据类型new具体的Pizza实现类,将来如果增加或减少Pizza的种类,PizzaStore是不需要改动的,仅改动本来就是变化部分的工厂类即可。保持PizzaStore不改动,也符合了“对扩展开放,对修改关闭”的原则。简单工厂是把全部的事情(创建各种Pizza对象)在一个地方都处理完了,然后供PizzaStore客户使用。
参考资料:《Head First设计模式》
0 0
- 简单工厂,工厂,抽象工厂
- 简单工厂、工厂、抽象工厂
- 简单工厂、工厂、抽象工厂
- 工厂模式-简单工厂
- 简单工厂 静态工厂
- 工厂模式-简单工厂
- 工厂 > 简单工厂
- 简单工厂,工厂方法
- 简单工厂
- 简单工厂
- 简单工厂
- 简单工厂
- 简单工厂
- 简单工厂
- 简单工厂
- 简单工厂
- 简单工厂
- 简单工厂
- 我的Android进阶之旅------>解决:Failed to create 'build\outputs\apk\watch-debug-unaligned.apks': 拒绝访问。
- How To Determine Web Application Thread Pool Size
- powerdesigner 12 15 如何导入sql库表结构
- [C++]static, virtual, const关键字
- Struts.xml配置中的包介绍
- 工厂 > 简单工厂
- EYSegmentViewController的使用
- 深入理解session和cookie
- Linux中profile、bashrc、bash_profile之间的区别和联系
- 机器学习算法-汇总
- HDU 1166 敌兵布阵(区间求和&(线段树|树状数组))
- ZOJ-3322-Who is Older?【7th浙江省赛】
- iOS App集成Apple Pay教程(附示例代码)
- Spring的XML配置文件中的bean的子元素lookup-method的作用是什么