定义:提供一个接口获取对象,而不必对外暴露创建对象的逻辑
假如要开一家炒饭店,炒饭的种类有:酱油炒饭,扬州炒饭,蛋炒饭,香肠炒饭,虾仁炒饭;
高级的程序员知道说要把炒饭做成接口,子类继承这个接口来实现不同的炒饭。这样就能在运行时通过接口来引用动态的初始化的子类,而不需要针对具体的子类编程。
interface FriedRice{
public void prepare();
public void fried();
}
class JiangYouFriedRice implements FriedRice {
...
}
class YangZhouFriedRice implements FriedRice {
...
}
...
实现一份具体炒饭的过程可能的代码如下:
public class Restaurant {
public static void main(Stiring[] args) {
String riceType = args[0];
FriedRice friedRice;
if ("JiangYouFriedRice".equals(riceType)) {
friedRice = new JiangYouFriedRice();
} else if ("YangZhouFriedRice".equals(riceType)) {
friedRice = new YangZhouFriedRice();
}
...
friedRice.prepare();
friedRice.fried();
}
}
如果饭店炒饭类型增加,就需要修改这里的 if else 逻辑。当有的炒饭没人喜欢,需要去掉时,也需要修改这里的逻辑。这里的 if else 不仅不“优雅”,还是变化的点。
这时候很容易想到的就是,把这段代码迁移到另一个类中。例如下面的代码:
public class SimpleFriedRiceFactory {
public static FriedRice getFriedRice(String type) {
FriedRice friedRice;
if ("JiangYouFriedRice".equals(riceType)) {
friedRice = new JiangYouFriedRice();
} else if ("YangZhouFriedRice".equals(riceType)) {
friedRice = new YangZhouFriedRice();
}
...
friedRice.prepare();
friedRice.fried();
}
}
public class Restaurant {
public static void main(Stiring[] args) {
String riceType = args[0];
FriedRice friedRice = SimpleFriedRiceFactory
.getFriedRice(riceType);
}
}
像这样把构建对象的复杂逻辑抽离出来,只对外暴露获取对象的接口的模式就是简单工厂模式。这里使用了静态方法,也可以叫做静态工厂方法。也可以不通过静态方法,而使用类来实现同样的功能。但静态方法的好处是,不需要实现具体的工厂类就能够对外提供需要构建的对象。