工厂模式:定义一个创建对象的接口,由子类来确定要创建的具体对象
介绍简单工厂方法模式的时候举了一个炒饭的例子。现在假设,饭店被北京的老板投资了,要去北京开一家分店。
好的饭店会根据不同区域顾客的口味对炒饭稍微做点调整,例如北方偏咸,南方偏甜。那么对于原来的简单工厂做个稍微的调整;
public class SimpleFriedRiceFactory {
/**
*@type 炒饭类型
*@flavor 口味
*/
public static FriedRice getFriedRice(String type, String flavor) {
FriedRice friedRice;
if ("north".equals(flavor)) {
if ("JiangYouFriedRice".equals(riceType)) {
friedRice = new NorthJiangYouFriedRice();
} else if ("YangZhouFriedRice".equals(riceType)) {
friedRice = new NorthYangZhouFriedRice();
}
} else if ("south".equals(flavor)) {
if ("JiangYouFriedRice".equals(riceType)) {
friedRice = new SouthJiangYouFriedRice();
} else if ("YangZhouFriedRice".equals(riceType)) {
friedRice = new SouthYangZhouFriedRice();
}
}
...
friedRice.prepare();
friedRice.fried();
}
}
在简单工厂方法的基础上,新增了“口味”的参数,通过先区分不同的口味,在区分炒饭的类型,来生成具体的炒饭对象。
但是这样的改动已经让代码越来月复杂。再去其他地方开分店的时候,有需要新增不一样的口味。是时候升级一下了。
首相先定义一个创建对象的父类,并预留创建对象的接口。
public class FriedRiceFactory {
public FriedRice getFriedRice(String type) {
// 预留给子类决定要创建的对象
}
}
对于北方的饭店可以实现自己的工厂。
public class NorthFriedRiceFactory extends FriedRiceFactory{
public FriedRice getFriedRice(String type) {
if ("JiangYouFriedRice".equals(riceType)) {
friedRice = new NorthJiangYouFriedRice();
} else if ("YangZhouFriedRice".equals(riceType)) {
friedRice = new NorthYangZhouFriedRice();
}
}
}
南方的饭店也可以实现自己的工厂。
public class SouthFriedRiceFactory extends FriedRiceFactory{
public FriedRice getFriedRice(String type) {
if ("JiangYouFriedRice".equals(riceType)) {
friedRice = new SouthJiangYouFriedRice();
} else if ("YangZhouFriedRice".equals(riceType)) {
friedRice = new SouthYangZhouFriedRice();
}
}
}
如果以后需要在其他区域开分店,就不需要给更改原有的创建对象的方法了,只需要继承 FriedRiceFactory ,让新的工厂对象来决定创建的具体对象就行了。
这种把实例化对象的逻辑放到子类中决定的模式就是工厂方法模式;