工厂方法模式:定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
加盟披萨店的例子来说明这个模式。需求:根据不同区域的差异,每家加盟店都可能想要提供不同风味的披萨。
首先我们知道,在不同区域中,都存在不同的披萨加盟店。那总店就相当于一个超类,其他的加盟店就属于子类,披萨由披萨店生产,那么我们就可以允许子类,也就是各区域的加盟店来决定生产什么口味的披萨了。简单点说就是让子类做决定。
/** * 实现加盟披萨店的做法 * PizzaStore作为超类,让每个域类型, * 如NYPizzaStore,ChicagoPizzaStore,CaliforniaPizzaStore * 都继承这个类,每个子类各自决定如何制造披萨---允许子类做决定 * @author Administrator * *///将PizzaStore声明为抽象的public abstract class PizzaStore { public Pizza orderPizza(String type){ Pizza pizza = null; pizza = createPizza(type);//从简单工厂中移回来。 pizza.PRepare(); pizza.bake(); pizza.box(); return pizza; } // 将这个方法,定义为抽象的 abstract Pizza createPizza(String type);}public class NYPizzaStore extends PizzaStore { @Override public Pizza createPizza(String type) { Pizza pizza = null; if ("cheese".equals(type)) { pizza = new NYCheesePizza(); } else if ("pepperoni".equals(type)) { pizza = new NYPepperonipizza(); } else if ("clam".equals(type)) { // pizza= new NyClamPizza(); 更多的纽约风格style } return pizza; }}public abstract class Pizza { void prepare() { System.out.println("preparing..."); } void bake() { System.out.println("backing...."); } void cut() { System.out.println("cutting"); } void box() { System.out.println("boxing"); } void getName() { }}public class NYCheesePizza extends Pizza { void getName() { System.out.println("I am a NYCheesePizza...."); }}public class NYPepperoniPizza extends Pizza { }/** * 测试类 * @author Administrator * */public class PizzaTestDrive { public static void main(String[] args) { PizzaStore nyStore = new NYPizzaStore(); Pizza pizza = nyStore.orderPizza("cheese"); pizza.getName(); }}优点:工厂方法帮助我们将产品的“实现”从“使用”中解耦。对比简单工厂:子类的确看起来很像简单工厂。简单工厂把全部事情,在一个地方都处理完了,然而工厂方法却是创建一个框架,让子类决定要如何实现。
新闻热点
疑难解答