工厂模式一般可分为三类:简单工厂模式、抽象工厂模式、工厂方法模式。其中,简单工厂其实不是一个设计模式,反而比较像一种编程习惯。
抽象工厂模式:提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
工厂方法模式:定义了一个创建对象的接口,担由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类
抽象工厂创建的是一个产品家族,它的方法经常以工厂方法的方式实现。
简单工厂模式
用一个"工厂”类来处理创建对象的细节,实际使用时通过该“工厂”类的方法获取实例。
产品
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 设计模式》