工厂模式包括三种:简单工厂模式、工厂方法模式和抽象工厂模式。
严格意义上讲,简单工厂模式不能算作设计模式,充其量只是封装,遵守了比较好的设计原则。本文主要探索工厂方法模式和抽象工厂模式。
工厂方法模式
定义一个创建对象的接口,但由子类决定要实例化的类是哪一个,工厂方法让类把实例化推迟到子类。
比如,现在要通过ChinesePizza店订购培根Pizza。这里将PizzaStore写成抽象类,ChinesePizzaStore或者之后的AmericanPizzaStore都将继承该类,且该类中的createPizza方法写成抽象方法,即Pizza口味由实例化的子类决定。
代码如下:
public abstract class PizzaStore {
Pizza pizza;
public Pizza orderPizza(String type) {
pizza = createPizza(type);
return pizza;
}
protected abstract Pizza createPizza(String type);
}
ChinesePizzaStore.java:
public class ChinesePizzaStore extends PizzaStore {
@Override
protected Pizza createPizza(String type) {
if (type.equals("Cheese")){
return new CheesePizza();
}else if (type.equals("Bacon")){
return new BaconPizza();
}else {
return null;
}
}
}
Pizza.java:
public abstract class Pizza {
String name;
public String getName(){
return name;
}
}
BaconPizza.java:
public class BaconPizza extends Pizza {
public BaconPizza(){
name = "Bacon";
}
}
这样,通过createPizza这个工厂方法,将具体Pizza的实现放到工厂如ChinesePizzaStore中实现,写一个Main方法做测试:
public class Main {
public static void main(String[] args){
ChinesePizzaStore chinesePizzaStore = new ChinesePizzaStore();
Pizza pizza = chinesePizzaStore.orderPizza("Bacon");
System.out.println("Pizza name is:" + pizza.getName());
}
}
输出:
Pizza name is:Bacon
Process finished with exit code 0
一个很简单的小例子,直接从书上copy过来的,如果以后有更多的具体PizzaStore的话,只需要继承抽象PizzaStore即可,不用修改太多代码。工厂方法主要就是采用继承,把对象的创建委托给子类,子类实现工厂方法来创建对象。遵循的设计原则:依赖倒置。即避免依赖具体类型,尽量以来抽象。
抽象工厂模式:
提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
还以Pizza为例,现在不同区域的Pizza原料不同了,PizzaStore应该直接从不同区域拿原料。
结构如下:
与工厂方法相比,主要区别在于,新建了一个接口PizzaIngredientFactory,不同区域的原料工厂实现此接口。
public interface PizzaIngredientFactory {
Dough createDough();
Cheese createCheese();
}
在这些具体工厂中实现工厂方法:
public class ChinesePizzaIngredientFactory implements PizzaIngredientFactory {
@Override
public Dough createDough() {
return new ThickDough();
}
@Override
public Cheese createCheese() {
return new WhiteCheese();
}
}
而创建具体Pizza时,只需要将对应的工厂参数传递进去。
public class CheesePizza extends Pizza {
PizzaIngredientFactory pizzaIngredientFactory;
Dough dough;
Cheese cheese;
public CheesePizza(PizzaIngredientFactory pizzaIngredientFactory){
this.pizzaIngredientFactory = pizzaIngredientFactory;
name = "cheese";
}
@Override
void prepare() {
dough = pizzaIngredientFactory.createDough();
cheese = pizzaIngredientFactory.createCheese();
}
}
public class ChinesePizzaIngredientFactory implements PizzaIngredientFactory {
@Override
public Dough createDough() {
return new ThickDough();
}
@Override
public Cheese createCheese() {
return new WhiteCheese();
}
}
太懒了,直接上图。
PS. Android中的工厂模式应该挺多,经常接触的,BitmapFactory绝对是一个,而且是简单工厂模式,主要封装一些decode**()方法,其它的有待研究。