前言
本文来自《Head Fist 设计模式》一书的实例,这里仅仅是个人笔记记录
上一篇笔记
http://blog.csdn.net/su749520/article/details/78524122
Pizza加盟店
上文对单个Pizza店进行良好编程习惯的开发,接下来需要继续复用和拓展,即新增基于总店Pizza店的加盟店模式开发。
注意加盟店的特点是:
1.制作流程必须依赖总店;
// 保持总店的流程
mPizza.prepare();
mPizza.bake();
mPizza.cut();
mPizza.box();
2.允许加盟店本身特色的灵活运作;
public abstract BasePizza createPizza(String type);
Pizza总店
package com.su.factorymode.my.method;
public abstract class BasePizzaFactory {
// 奶酪
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";
/**
* 加盟店抽象接口
*
* @param type
* @return
*/
public abstract BasePizza createPizza(String type);
/**
* 1.流程遵循总店
* 2.允许加盟店本身的灵活变化
* @param type
* @return
*/
public BasePizza orderPizza(String type) {
// 加盟店根据自身区域特色创建Pizza
BasePizza mPizza = createPizza(type);
// 保持总店的流程
mPizza.prepare();
mPizza.bake();
mPizza.cut();
mPizza.box();
return mPizza;
}
}
加盟店
Demo 1
package com.su.factorymode.my.method;
import android.util.Log;
public class ShangHaiPizzaFactory extends BasePizzaFactory {
private static final String TAG = ShangHaiPizzaFactory.class.getSimpleName();
/**
* 上海风味Pizza加盟店
*/
@Override
public BasePizza createPizza(String type) {
Log.d(TAG, "ShangHaiPizzaFactory");
BasePizza mPizza = null;
if (BasePizzaFactory.Type_Cheese.equals(type)) {
mPizza = new ShangHaiCheesePizza();
} else if (BasePizzaFactory.Type_Clam.equals(type)) {
mPizza = new ShangHaiClamPizza();
} else if (BasePizzaFactory.Type_Veggie.equals(type)) {
mPizza = new ShangHaiVeggiePizza();
}
return mPizza;
}
}
Demo 2
package com.su.factorymode.my.method;
import android.util.Log;
public class ShenZhenPizzaFactory extends BasePizzaFactory {
private static final String TAG = ShenZhenPizzaFactory.class.getSimpleName();
/**
* 深圳风味Pizza加盟店
*/
@Override
public BasePizza createPizza(String type) {
Log.d(TAG, "ShenZhenPizzaFactory");
BasePizza mPizza = null;
if (BasePizzaFactory.Type_Cheese.equals(type)) {
mPizza = new ShenZhenCheesePizza();
} else if (BasePizzaFactory.Type_Clam.equals(type)) {
mPizza = new ShenZhenClamPizza();
} else if (BasePizzaFactory.Type_Veggie.equals(type)) {
mPizza = new ShenZhenVeggiePizza();
}
return mPizza;
}
}
结语
上述加盟店的操作做到了
1.解耦化,即orderPizze()并不知道createPizze()具体是哪家加盟店参与进来;
2.允许子类灵活变化ShenZhenPizzaFactory 和ShangHaiPizzaFactory ,选择自身特色;
ShenZhenPizzaFactory与ShangHaiPizzaFactory 即获得了BasePizzaFactory 的全部功能,又通过自身的createPizza()灵活变动。