-
需求分析:
假设现在有一个比萨店, 客户可以向比萨店点不同类型比萨.public class PizzaStore { public Pizza orderPizza(String type) { if ("cheese".equals(type)) { pizza = new CheesePizza(); } else if ("greek".equals(type)) { pizza = new GreekPizza(); } else if ("pepperoni".equals(type)) { pizza = new PepperoniPizza(); } pizza.bake(); pizza.cut(); pizza.box(); return pizza; } }现在由于比萨店发展得太好了, 需要在各个地方开分店, 但是由于各个地方的口味不同, 每个地方的比萨店都需要退出适合当地人口味的比萨. 并且要保持整个比萨的制作流程的规范性.
/** * 抽象的比萨店 */ public abstract class PizzaStore { public Pizza(String type) { Pizza pizza = createPizza(type); pizza.bake(); pizza.cut(); pizza.box(); return pizza; } protected 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 NYStyleCheesePizza(); } else if ("veggie".equals(type)) { pizza = new NYStyleVeggiePizza(); } else if ("clam".equals(type)) { pizza = new NYStyleClamPizza(); } else if ("pepperoni".equals(type)) { pizza = new NYStylePepperoniPizza(); } return pizza; } } /** * 客户端 */ public class Client { public static void main(String[] args) { PizzaStore pizzaStore = new NYPizzaStore(); Pizza cheesePizza = pizzaStore.orderPizza("cheese"); } }客户直接向他所在的区域的比萨店点他想要的比萨类型就可以了. 这里的比萨店就对应工厂模式中的工厂, 在这里可以称为比萨工厂.
-
工厂模式的定义:
Define an interface for creating an object, but let subclasses decide whici class to instantiate. Factory Method lets a class defer instantiation to subclasses(定义一个用于创建对象的接口, 让子类决定实例化哪一个类. 工厂方法使一个类的实例化延迟到其子类) -
工厂模式的应用:
java.util.Calendar#getInstance()方法
java.util.ResourceBundle#getBundle()方法
java.text.NumberFormat#getInstance()方法
java.nio.charset.Charset#forName()方法 -
参考:
[1] : Java 库中的设计模式
[2] : 设计模式之禅
[3] : Head First 设计模式
[4] : 三种工厂方法模式