背景
工厂模式
,顾名思义,就是生产对象的一种方式。传统使用new的方法有一些弊端:耦合问题,构造参数太多后不便等。
下面我们从一个示范,来看看使用new会遇到哪些问题。
public interface Pizza {
void prepare();
void bake();
void cut();
void box();
}
public class CheesePizza implements Pizza {
public void prepare() {}
public void bake() {}
public void cut() {}
public void box() {}
}
Pizza orderPizza(String type) throws Exception {
Pizza pizza;
// 当增加/删除特定类型的pizza时, 这里的代码会频繁改动
if (type.equals("cheese")) {
pizza = new CheesePizza();
} else if (type.equals("greek")) {
pizza = new GreekPizza();
} else {
throw new Exception("no type pizza. type=" + type);
}
// 下面的部分代码不会改变
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
将频繁改动的代码封装起来
public class SimplePizzaFactory {
public Pizza createPizza(String type) throws Exception {
Pizza pizza;
// 当增加/删除特定类型的pizza时, 这里的代码会频繁改动
if (type.equals("cheese")) {
pizza = new CheesePizza();
} else if (type.equals("greek")) {
pizza = new GreekPizza();
} else {
throw new Exception("no type pizza. type=" + type);
}
return pizza;
}
}
以上封装有几点说明如下:
- 以后关于创建对象的改动都只需改动这一处代码,方便管理
- 创建对象的方法也可以定义为一个静态方法,常被称为
静态工厂
。但这样一来,就不能够通过继承来改变创建方法的行为。
工厂模式定义
工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
工厂模式类图如下:todo