简单点,说话的方式简单点。
我是用《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 接口的类的实现。
最后,当然,所有的设计模式都可以根据实际需要,与其他模式结合使用。
网友评论