前言
本文来自《Head Fist 设计模式》一书的实例,这里仅仅是个人笔记记录
现象需求
package com.su.factorymode.none;
public class PizzaUtil {
// 奶酪
public static final String Type_Cheese = "Type_Cheese";
// 花蛤
public static final String Type_Clam = "Type_Clam";
// 希腊
public static final String Type_Greek = "Type_Greek";
// 意大利腊肠
public static final String Type_Pepperoni = "Type_Pepperoni";
// 素食
public static final String Type_Veggie = "Type_Veggie";
public static Pizza orderPizza(String type) {
Pizza mPizza = null;
/**
* 这里存在代码不灵活的问题,即运行时才知道具体类型 不方便增删的问题,请思考如何解决?
*/
if (Type_Cheese.equals(type)) {
mPizza = new CheesePizza();
} else if (Type_Clam.equals(type)) {
mPizza = new ClamPizza();
} else if (Type_Greek.equals(type)) {
mPizza = new GreekPizza();
} else if (Type_Pepperoni.equals(type)) {
mPizza = new PepperoniPizza();
} else if (Type_Veggie.equals(type)) {
mPizza = new VeggiePizza();
}
mPizza.prepare();
mPizza.bake();
mPizza.cut();
mPizza.box();
return mPizza;
}
}
分析
上述的披萨制作,会存在新增、修改、删除不灵活的问题,这里需要进行封装处理。
根据上述代码的特点,变化和不变化进行代码封装,即良好的编程习惯
1.经常变化的封装为一个SimplePizzaFactory类
if (Type_Cheese.equals(type)) {
mPizza = new CheesePizza();
} else if (Type_Clam.equals(type)) {
mPizza = new ClamPizza();
} else if (Type_Greek.equals(type)) {
mPizza = new GreekPizza();
} else if (Type_Pepperoni.equals(type)) {
mPizza = new PepperoniPizza();
} else if (Type_Veggie.equals(type)) {
mPizza = new VeggiePizza();
}
2.不变的封装为PizzaStore类
mPizza.prepare();
mPizza.bake();
mPizza.cut();
mPizza.box();
解决
工厂类
只负责提供Pizza的分类,这里不使用静态工厂【SimplePizzaFactory.createPizza(type)】的目的是为了后续继承拓展方便
package com.su.factorymode.simple;
public class SimplePizzaFactory {
public Pizza createPizza(String type) {
Pizza mPizza = null;
if (PizzaStore.Type_Cheese.equals(type)) {
mPizza = new CheesePizza();
} else if (PizzaStore.Type_Clam.equals(type)) {
mPizza = new ClamPizza();
} else if (PizzaStore.Type_Greek.equals(type)) {
mPizza = new GreekPizza();
} else if (PizzaStore.Type_Pepperoni.equals(type)) {
mPizza = new PepperoniPizza();
} else if (PizzaStore.Type_Veggie.equals(type)) {
mPizza = new VeggiePizza();
}
return mPizza;
}
}
即先前的解决方案如下
package com.su.factorymode.simple;
public class PizzaStore {
// 奶酪
public static final String Type_Cheese = "Type_Cheese";
// 花蛤
public static final String Type_Clam = "Type_Clam";
// 希腊
public static final String Type_Greek = "Type_Greek";
// 意大利腊肠
public static final String Type_Pepperoni = "Type_Pepperoni";
// 素食
public static final String Type_Veggie = "Type_Veggie";
private SimplePizzaFactory mSimplePizzaFactory;
public void setSimplePizzaFactory(SimplePizzaFactory mSimplePizzaFactory) {
this.mSimplePizzaFactory = mSimplePizzaFactory;
}
public Pizza orderPizza(String type) {
Pizza mPizza = mSimplePizzaFactory.createPizza(type);
mPizza.prepare();
mPizza.bake();
mPizza.cut();
mPizza.box();
return mPizza;
}
}
结语
学习到这里我真的没感觉到工厂模式的精神,感觉就是封装啊,一个类根据用途特性分为2个独立功能的类而已。明天继续学习看下真正的工厂模式到底是什么?