Java 设计模式-工厂方法模式

220 阅读1分钟
  1. 需求分析:
    假设现在有一个比萨店, 客户可以向比萨店点不同类型比萨.

    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");
        }
    }
    

    客户直接向他所在的区域的比萨店点他想要的比萨类型就可以了. 这里的比萨店就对应工厂模式中的工厂, 在这里可以称为比萨工厂.

  2. 工厂模式的定义:
    Define an interface for creating an object, but let subclasses decide whici class to instantiate. Factory Method lets a class defer instantiation to subclasses(定义一个用于创建对象的接口, 让子类决定实例化哪一个类. 工厂方法使一个类的实例化延迟到其子类)

    factory-method

  3. 工厂模式的应用:
    java.util.Calendar#getInstance() 方法
    java.util.ResourceBundle#getBundle() 方法
    java.text.NumberFormat#getInstance() 方法
    java.nio.charset.Charset#forName() 方法

  4. 参考:
    [1] : Java 库中的设计模式
    [2] : 设计模式之禅
    [3] : Head First 设计模式
    [4] : 三种工厂方法模式