掰扯设计模式 之 简单工厂,工厂方法,抽象工厂

简单点,说话的方式简单点。

我是用《Head First 设计模式》的代码样例来说明三者的关系。

  • 简单工厂:不是设计模式的“设计模式”。也是我们最常见、最简单的工厂模式。

    public class SimplePizzaFactory {
        public Pizza createPizza(String type) {
            Pizza pizza = null;
            if (type.equals("xxx")) {
                pizza = new XxxPizza();
            } else if (...) {
                pizza = ...;
            }
            return pizza;
        }
    }
    

    我见:createPizza() 可以是一个静态方法,也可以不是;根据参数的不同,返回不同的 Pizza 子类对象。

  • 工厂方法:定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。

    public abstract class PizzaStore {
        public Pizza orderPizza(String type) {
            Pizza pizza;
    
            pizza = createPizza(type);
    
            pizza.prepare();
            pizza.bake();
            pizza.cut();
            pizza.box();
    
            return pizza;
        }
    
        // 工厂方法
        protected abstract Pizza createPizza(String type);
    
    }
    

    我见:PizzaStore 可以是抽象类,也可以是一个接口,甚至可以不是抽象类;orderPizza() 算是模板方法模式,表明了工厂方法模式与其他模式根据实际需要的结合;工厂方法模式就是
    createPizza() 方法可以在具体的工厂子类中去实现,并返回具体的 Pizza 子类对象。

  • 抽象工厂:提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。

    public interface PizzaIngredientFactory {
        // Dough,Sauce ... 是做 Pizza 的各种原材料;
        // 同时他们代表的也是对应原材料的基类,具体的工厂实现类会提供具体的原材料
        public Dough createDough();
        public Sauce createSauce();
        public Cheese createCheese();
        public Veggies[] createVeggies();
        public Pepperoni createPepperoni();
        public Clams createClams();
    }
    

    我见:抽象工厂和工厂方法的区别,就是抽象工厂生产的是相关活依赖对象的家族;而工厂方法模式只生产一个具体类的对象。在《Head First 设计模式》的这个抽象工厂的例子中,每一个 createDough()、createXxxx() 方法都是一个工厂方法。按照书中说法,就是

    抽象工厂的方法经常以工厂方法的方式实现 ... 抽象工厂的任务是定义一个负责创建一组产品的接口。这个接口内的每个方法都负责创建一个具体的产品,同时我们利用实现抽象工厂的子类来提供这些具体的做法。
    所以,在抽象工厂中利用工厂方法实现生产方法是相当自然的做法。

关于具体的代码中设计模式的分类,有一个有趣的事情。在清华版的《Java 设计模式》(耿祥义 张跃平 著)中,在关于工厂方法模式与 Java 集合框架的章节中,说 Collection 的 iterator() 方法就是一个工厂方法。iterator() 方法返回一个实现 Iterator 接口的类的实现。

最后,当然,所有的设计模式都可以根据实际需要,与其他模式结合使用。

你可能感兴趣的:(掰扯设计模式 之 简单工厂,工厂方法,抽象工厂)