工厂模式一般可分为三类:简单工厂模式、抽象工厂模式、工厂方法模式。其中,简单工厂其实不是一个设计模式,反而比较像一种编程习惯。
抽象工厂模式:提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
工厂方法模式:定义了一个创建对象的接口,担由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类
抽象工厂创建的是一个产品家族,它的方法经常以工厂方法的方式实现。
简单工厂模式
用一个"工厂”类来处理创建对象的细节,实际使用时通过该“工厂”类的方法获取实例。
产品
public interface Pizza { void prepare(); }
public class VeggiePizza implements Pizza { public void prepare() { System.out.println("VeggiePizza prepare"); } }
public class CheesePizza implements Pizza { public void prepare() { System.out.println("CheesePizza prepare"); } }
简单工厂类
public class SimplePizzaFactory { public Pizza createPizza(String type) { Pizza pizza = null; if(type.equals("CheesePizza")) { pizza = new CheesePizza(); } else if(type.equals("VeggiePizza")) { pizza = new VeggiePizza(); } return pizza; } }通过简单工厂获取实例
public class PizzaStore { SimplePizzaFactory factory; public PizzaStore(SimplePizzaFactory factory) { this.factory = factory; } public Pizza orderPizza(String type) { Pizza pizza = factory.createPizza(type); pizza.prepare(); return pizza; } }
工厂方法模式
不再由一个对象负责所有具体类的实例化,而是将工厂方法设置成”抽象“的,由抽象工厂的子类来负责具体类的实例化。
产品
public abstract class Pizza { private String name; abstract void prepare(); public String getName() { return name; } public void setName(String name) { this.name = name; } }
public class CheesePizza extends Pizza { public CheesePizza() { this.setName("CheesePizza"); } public void prepare() { System.out.println("CheesePizza prepare"); } }
public class VeggiePizza extends Pizza { public VeggiePizza() { this.setName("VeggiePizza"); } public void prepare() { System.out.println("VeggiePizza prepare"); } }
工厂
//工厂方法模式 public abstract class PizzaStore { public Pizza orderPizza(String type) { //调用实例化产品类的抽象方法 Pizza pizza = createPizza(type); pizza.prepare(); return pizza; } //用工厂方法创建对象,由子类来负责实例化 abstract Pizza createPizza(String type); }
public class NYStylePizzaStore extends PizzaStore { Pizza createPizza(String type) { Pizza pizza = null; if(type.equals("CheesePizza")) { pizza = new CheesePizza(); } else if(type.equals("VeggiePizza")) { pizza = new VeggiePizza(); } return pizza; } }
public class ChicagoStylePizzaStore extends PizzaStore { Pizza createPizza(String type) { Pizza pizza = null; if(type.equals("CheesePizza")) { pizza = new CheesePizza(); } else if(type.equals("VeggiePizza")) { pizza = new VeggiePizza(); } return pizza; } }
测试
public class Test { public static void main(String[] args) { NYStylePizzaStore store = new NYStylePizzaStore(); Pizza pizza = store.orderPizza("CheesePizza"); System.out.println("Pizza: " + pizza.getName()); } }输出
CheesePizza prepare
Pizza: CheesePizza
抽象工厂模式
先为工厂定义一个接口,然后具体工厂实现该接口。
工厂
public interface PizzaIngredientFactory { public Dough createDough(); public Sauce createSauce(); //.... }
public class NYPizzaIngredientFactory implements PizzaIngredientFactory { public Dough createDough() { return new ThinCrustDough(); } public Sauce createSauce() { return new MarinaraSauce(); } }
参考:《Head First 设计模式》