本文共 5232 字,大约阅读时间需要 17 分钟。
披萨项目:要方便披萨品种的扩展、要便于维护、要能运行时扩展
披萨族的设计:
抽象Pizza类,有四个方法:prepare()、bake(),cut(),box()实际的披萨:GreekPizza和CheesePizza
披萨工厂设计:if…else … if …else
package com.java.jikexueyuan.pizzastore.pizza;public abstract class Pizza { protected String name; public abstract void prepare(); public void bake() { System.out.println(name+" baking;"); } public void cut() { System.out.println(name+" cutting;"); } public void box() { System.out.println(name+" boxing;"); } public void setname(String name) { this.name=name; }}
package com.java.jikexueyuan.pizzastore.pizza;public class CheesePizza extends Pizza { @Override public void prepare() { // TODO Auto-generated method stub super.setname("CheesePizza"); System.out.println(name+" preparing;"); }}
package com.java.jikexueyuan.pizzastore.pizza;public class GreekPizza extends Pizza { @Override public void prepare() { // TODO Auto-generated method stub super.setname("GreekPizza"); System.out.println(name+" preparing;"); }}
package com.java.jikexueyuan.pizzastore;public class OrderPizza { public OrderPizza() { Pizza pizza = null; String ordertype; do { ordertype = gettype(); //控制台输入 if (ordertype.equals("cheese")) { pizza = new CheesePizza(); } else if (ordertype.equals("greek")) { pizza = new GreekPizza(); } else if (ordertype.equals("pepper")) { pizza = new PepperPizza(); } else if (ordertype.equals("chinese")) { pizza = new ChinesePizza(); } else { break; } pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); } while (true); }}
简单工厂总结:如果要扩展新的pizza,就要将OrderPizza这个简单工厂停下来修改其中代码。
将变化的地方抽取出来,使用简单工厂来封装,这样就不用停止orderPizza的运行,如下:
定义一个实例化披萨对象的类,封装创建对象的代码
public class SimplePizzaFactory { public Pizza CreatePizza(String ordertype) { Pizza pizza = null; if (ordertype.equals("cheese")) { pizza = new CheesePizza(); } else if (ordertype.equals("greek")) { pizza = new GreekPizza(); } else if (ordertype.equals("pepper")) { pizza = new PepperPizza(); } return pizza; }}
public class OrderPizza { SimplePizzaFactory mSimplePizzaFactory; public OrderPizza(SimplePizzaFactory mSimplePizzaFactory) { setFactory(mSimplePizzaFactory); } public void setFactory(SimplePizzaFactory mSimplePizzaFactory) { Pizza pizza = null; String ordertype; this.mSimplePizzaFactory = mSimplePizzaFactory; do { ordertype = gettype(); pizza = mSimplePizzaFactory.CreatePizza(ordertype); if (pizza != null) { pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); } } while (true); }
将对象的实例化推迟到子类
困惑:披萨项目加盟店
解决:将披萨对象实例化功能抽象成抽象方法,在不同加盟店具体实现功能;package com.java.jikexueyuan.pizzastore.method;public abstract class OrderPizza { public OrderPizza() { Pizza pizza = null; String ordertype; do { ordertype = gettype(); pizza = createPizza(ordertype); pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); } while (true); } // 方法抽象出来 abstract Pizza createPizza(String ordertype);}
package com.java.jikexueyuan.pizzastore.method;public class NYOrderPizza extends OrderPizza { @Override Pizza createPizza(String ordertype) { Pizza pizza = null; if (ordertype.equals("cheese")) { pizza = new NYCheesePizza(); } else if (ordertype.equals("pepper")) { pizza = new NYPepperPizza(); } return pizza; }}
public class LDOrderPizza extends OrderPizza { @Override Pizza createPizza(String ordertype) { Pizza pizza = null; if (ordertype.equals("cheese")) { pizza = new LDCheesePizza(); } else if (ordertype.equals("pepper")) { pizza = new LDPepperPizza(); } return pizza; }}
定义一个接口,用于创建相关或有依赖关系的对象族,而无需明确指定具体类。
package com.java.jikexueyuan.pizzastore.absfactory;public interface AbsFactory { public Pizza CreatePizza(String ordertype) ;}
package com.java.jikexueyuan.pizzastore.absfactory;public class LDFactory implements AbsFactory { @Override public Pizza CreatePizza(String ordertype) { Pizza pizza = null; if (ordertype.equals("cheese")) { pizza = new LDCheesePizza(); } else if (ordertype.equals("pepper")) { pizza = new LDPepperPizza(); } return pizza; }}
package com.java.jikexueyuan.pizzastore.absfactory;public class NYFactory implements AbsFactory { @Override public Pizza CreatePizza(String ordertype) { Pizza pizza = null; if (ordertype.equals("cheese")) { pizza = new NYCheesePizza(); } else if (ordertype.equals("pepper")) { pizza = new NYPepperPizza(); } return pizza; }}
package com.java.jikexueyuan.pizzastore.absfactory;public class OrderPizza { AbsFactory mFactory; public OrderPizza(AbsFactory mFactory) { setFactory(mFactory); } public void setFactory(AbsFactory mFactory) { Pizza pizza = null; String ordertype; this.mFactory = mFactory; do { ordertype = gettype(); pizza = mFactory.CreatePizza(ordertype); if (pizza != null) { pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); } } while (true); }}
例如,OrderPizza类中创建披萨的变量;
转载地址:http://bhaji.baihongyu.com/