package factory; /** * @author jiq * 类型:Creational * 定义: 工厂方法模式(Factory Method)定义一个创建对象的接口,但由子类决定 * 要实例化的类是哪一个。 工厂方法将类的实例化推迟到子类。 * OO原则: 要依赖抽象,而不要依赖具体类 */ /************ * Pizza商店 * **********/ abstract class PizzaStore{ public Pizza oderPizza(String type){ Pizza pizza; /** * 提供抽象接口来创建“具体产品” * 超类并不知道正在创建的是什么pizza * */ pizza = createPizza(type); pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); return pizza; } /** * 工厂方法来处理具体对象的创建, * 并将这样的创建推迟到子类中。 * 这样客户程序中关于超类的代码就和创建子类的代码解耦了 * * 并不涉及具体类的创建,而是将各种pizza的创建交给各个商店 * */ abstract Pizza createPizza(String type); } //纽约Pizza店 class NYPizzaStore extends PizzaStore{ //子类实现工厂方法来创建具体的Pizza public Pizza createPizza(String type) { if(type.equals("cheese")){ return new NYSytleCheesePizza(); } else if(type.equals("viggie")){ return new NYSytleViggiePizza(); } else if(type.equals("clam")){ return new NYSytleClamPizza(); } else return null; } } //芝加哥Pizza店 class ChicagoPizzaStore extends PizzaStore{ //子类实现工厂方法来创建具体的Pizza public Pizza createPizza(String type) { if(type.equals("cheese")){ return new ChicagoStyleCheesePizza(); } else if(type.equals("clam")){ return new ChicagoStyleClamPizza(); } else return null; } } /******************************** * Pizza * ******************************/ abstract class Pizza{ String name; String dough; String sauce; void prepare(){System.out.println("Preparing:"+name);} void bake(){System.out.println("Bake 25 minutes at 250");} void cut(){System.out.println("Cutting the Pizza");} void box(){System.out.println("Box it in cartton box");} } /** * 各种纽约风格的Pizza * */ class NYSytleCheesePizza extends Pizza{} class NYSytleViggiePizza extends Pizza{} class NYSytleClamPizza extends Pizza{} /** * 各种芝加哥风格的Pizza * */ class ChicagoStyleCheesePizza extends Pizza{} class ChicagoStyleClamPizza extends Pizza{} /** * 客户端程序,客户预订Pizza * */ public class FactoryMethod { public static void main(String[] args) { /* 创建两个Pizza商店 */ PizzaStore nyStore = new NYPizzaStore(); PizzaStore cgStore = new ChicagoPizzaStore(); /* 使用PizzaStore下订单 */ Pizza pizza1 = nyStore.oderPizza("cheese"); Pizza pizza2 = cgStore.oderPizza("cheese"); } }