工厂 > 工厂方法模式
来源:互联网 发布:淘宝小果澳洲代购 编辑:程序博客网 时间:2024/06/09 23:54
工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个(子类实现M,完成具体类实例的创建),工厂方法让类把实例化推迟到子类。
所有工厂模式都用来封装对象的创建,工厂方法模式也不例外。工厂方法模式可以分为几个角色类:抽象创建者类(PizzaStore )、抽象创建者的实现类(NYPizzaStore )、抽象产品(Pizza)、抽象产品的实现类(NYStyleCheesePizza等)。
该模式下的类图:
以Head First的预定Pizza为例。
1.抽象的创建者(Abstract Factory)
抽象的创建者通常定义一个抽象的工厂方法,该方法返回的是抽象产品,具体产品由子类实现该方法决定。
包含抽象的工厂方法的抽象创建者PizzaStore:
/** * 抽象创建者类,定义了一个抽象的工厂方法,让子类实现此方法制造产品 */public abstract class PizzaStore { public Pizza orderPizza(String type){ /** * 抽象创建者通常包括依赖抽象产品的代码,而这些抽象产品由子类制作,创建者不需要真的知道在制造哪种具体的产品 */ Pizza pizza = createPizza(type); pizza.prepare(); return pizza; } //抽象的工厂方法 abstract Pizza createPizza(String type);}
2.抽象创建者的实现类(Concrete Factory)
实现createPizza抽象方法的子类NYPizzaStore :
/** * 能够产生产品的类成为具体创建者 *因为每个加盟店都有自己的PizzaStore子类,所以可以利用实现createPizza()创建自己风味的Pizza */public class NYPizzaStore extends PizzaStore{ @Override public Pizza createPizza(String type) { if("cheese".equals(type)){ return new NYStyleCheesePizza(); }else if("clam".equals(type)){ return new NYStyleClamPizza(); } return null; }}
这个方法的实现有些像简单工厂,但简单工厂会把各种实例的创建封装在工厂类里,然后工厂被提供给客户NYPizzaStore使用。
测试:
public class FactoryMethodTest { public static void main(String[] args) { PizzaStore nyStore = new NYPizzaStore(); Pizza nyPizza = nyStore.orderPizza("cheese"); PizzaStore chicagoStore = new ChicagoPizzaStore(); Pizza cgoPizza = chicagoStore.orderPizza("cheese"); }}
工厂方法让子类决定要实例化的类是哪一个,所谓的决定,不是指模式允许子类本身在运行时做决定,而是指编写创建者类PizzaStore时,
不需要知道实际创建的产品是哪一个,选择了使用哪个子类,自然就决定了实际创建的产品是什么。
工厂模式的好处是帮助我们将产品的“实现”(具体的实现类NYPizzaStore)从“使用”(PizzaStore使用产品)中解耦,
如果增加产品,增加California相关口味的Pizza,那么所有的类都不受影响,只需要增加PizzaStore新的子类CaliforniaPizzaStore实现createPizza方法,并继承Pizza实现California口味的CaliforniaStyleCheesePizza、CaliforniaStyleClamPizza,完全符合“对扩展开放,对修改关闭”的原则。
参考资料:《Head First 设计模式》
- 工厂模式 -- 工厂方法
- 工厂模式-工厂方法
- 工厂模式-工厂方法
- 工厂 > 工厂方法模式
- 工厂模式-工厂方法模式
- 工厂模式-工厂方法模式
- 工厂模式---工厂方法模式
- 简单工厂、工厂方法、抽象工厂模式
- 简单工厂、工厂方法、抽象工厂模式
- 工厂模式(简单工厂、工厂方法)
- 简单工厂|工厂方法|抽象工厂模式
- 工厂方法,抽象工厂模式
- C#工厂模式-工厂方法
- 工厂模式 和工厂方法
- 工厂模式-C-工厂方法
- 工厂模式以及工厂方法
- 设计模式-工厂模式(简单工厂,工厂方法,抽象工厂)
- java工厂模式-简单工厂,工厂方法,抽象工厂模式
- 完全卸载Mysql
- JVM学习笔记(三)------内存管理和垃圾回收
- 【网络基本功一】细说网络传输
- linux shell脚本监控进程,如果进程不在,则重启之
- 如何解决IE9以下的浏览器对html5标签不兼容的问题
- 工厂 > 工厂方法模式
- BaseAdapter需实现的四个方法介绍
- 2015 免费申请邓白氏码的步骤
- JCIP-5-Building Blocks
- Maven创建WEB项目
- 数组中重复的数字
- 微信开发中文乱码问题总结
- JavaScript编程纠错
- 推荐系统中协同过滤算法实现分析