工厂方法模式
来源:互联网 发布:英国劳氏海事数据库 编辑:程序博客网 时间:2024/06/04 19:08
核心:只持有抽象的接口引用,由子类去决定实例的创建,将实例化推到子类中去。
同样采用Pizza的例子,当纽约(NY)和芝加哥(Chicago)都开了pizza店,且者两个地方的同类型Pizza味道不同。可以构建如下类:
可以看到createPizza在父类中申明为抽象的,用户首先得创建一个店,NYPizzaStore store,当用户调用AbstractPizzaStore.orderPizza()时,orderPizza()转而调用AbstractPizzaStore.createPizza方法,由于这个方法是抽象的,所以调用的是子类的NYPizzaStore.createPizza(),这个方法根据字符串type返回不同的Pizza。代码如下:
首先是Pizza超类
package Factory.MethodFactory;/** * Created by sgzhang on 2015/8/12. */public abstract class Pizza { abstract void eat();}
接着ChicagoPizza群
//ChicagoCheesePizza
package Factory.MethodFactory;/** * Created by sgzhang on 2015/8/12. */public class ChicagoCheesePizza extends Pizza{ @Override void eat() { System.out.println("ChicagoCheesePizza"); }}//ChicagoGreekPizza
package Factory.MethodFactory;/** * Created by sgzhang on 2015/8/12. */public class ChicagoGreekPizza extends Pizza{ @Override void eat() { System.out.println("ChicagoGreekPizza"); }}//ChicagoHotPizza
package Factory.MethodFactory;/** * Created by sgzhang on 2015/8/12. */public class ChicagoHotPizza extends Pizza{ @Override void eat() { System.out.println("ChicagoHotPizza"); }}
//NYCheesePizza
package Factory.MethodFactory;/** * Created by sgzhang on 2015/8/12. */public class NYCheesePizza extends Pizza { @Override void eat() { System.out.println("NYCheesePizza"); }}
//NYGreekPizza
package Factory.MethodFactory;/** * Created by sgzhang on 2015/8/12. */public class NYGreekPizza extends Pizza{ @Override void eat() { System.out.println("NYGreekPizza"); }}//NYHotPizza
package Factory.MethodFactory;/** * Created by sgzhang on 2015/8/12. */public class NYHotPizza extends Pizza{ @Override void eat() { System.out.println("NYHotPizza"); }}
然后是store(工厂)超类
package Factory.MethodFactory;/** * Created by sgzhang on 2015/8/12. */public abstract class PizzaStore { public Pizza orderPizza(String type){ Pizza pizza=createPizza(type); return pizza; } protected abstract Pizza createPizza(String type);}
//ChicagoPizzaStore
package Factory.MethodFactory;/** * Created by sgzhang on 2015/8/12. */public class ChicagoPizzaStore extends PizzaStore { @Override public Pizza createPizza(String type) { Pizza pizza=null; if(type.equals("Cheese")){ pizza=new ChicagoCheesePizza(); }else if(type.equals("Greek")){ pizza=new ChicagoGreekPizza(); }else{ pizza=new ChicagoHotPizza(); } return pizza; }}//NYPizzaStore
package Factory.MethodFactory;/** * Created by sgzhang on 2015/8/12. */public class NYPizzaStore extends PizzaStore { @Override public Pizza createPizza(String type) { Pizza pizza=null; if(type.equals("Cheese")){ pizza=new NYCheesePizza(); }else if(type.equals("Greek")){ pizza=new NYGreekPizza(); }else{ pizza=new NYHotPizza(); } return pizza; }}
大功告成,接下来就是测试了
package Factory.MethodFactory;/** * Created by sgzhang on 2015/8/12. */public class FactoryRun { public static void main(String[] args){ PizzaStore pizzaStore=new ChicagoPizzaStore(); Pizza pizza=pizzaStore.orderPizza("Cheese"); pizza.eat(); }}
可以看到打印出来了
ChicagoCheesePizza
0 0
- 工厂模式 -- 工厂方法
- 工厂模式-工厂方法
- 工厂模式-工厂方法
- 工厂 > 工厂方法模式
- 工厂模式-工厂方法模式
- 工厂模式-工厂方法模式
- 工厂模式---工厂方法模式
- 【模式】工厂方法模式
- 工厂方法,抽象工厂模式
- C#工厂模式-工厂方法
- 工厂模式 和工厂方法
- 工厂模式-C-工厂方法
- 工厂模式以及工厂方法
- 简单工厂、工厂方法、抽象工厂模式
- 简单工厂、工厂方法、抽象工厂模式
- 工厂模式(简单工厂、工厂方法)
- 简单工厂|工厂方法|抽象工厂模式
- 设计模式-工厂模式(简单工厂模式+工厂方法模式)
- 微信企业号回调模式配置讲解 Java Servlet+Struts2版本 echostr校验失败解决
- java中TCP传输协议
- Spring的AOP相关知识
- HierarchyViewer源代码理解(三)
- Unity 场景异步加载
- 工厂方法模式
- 中国获得2022年冬奥会举办权【经济学人】
- java图片处理工具之-ImageMagick+jmagick(一)
- 赌神的战斗 coj
- 网络编程复习_ Exp2
- 黑马程序员——java复习总结——多线程
- 【VR】Leap Motion 官网文档 MagneticPinch (磁性捏取)
- 有哪些好的上报crash工具:推荐crashlytics
- 缓存清理