前言
本文来自《Head Fist 设计模式》一书的实例,这里仅仅是个人笔记记录
上一篇笔记
http://blog.csdn.net/su749520/article/details/78534261
Pizza的原料工厂
上一篇的Pizza加盟店主要是根据工厂模式建立起来
工厂模式主要是通过在基类定义一个抽象接口
public abstract Pizza createPizzaStore(),子类通过继承实现,完成解耦。
本期的需求是每个加盟店的原料可能存在质量的良莠不齐的情况,故建立原料工厂进行统一管理。
但是不同加盟店由于地区的特性可能存在原料风味,材料不同,所以这里引入了抽象工厂模式
抽象工厂模式
定义Pizza原料接口
定义一个原料工厂接口
/**
* 抽象工厂模式 这里区别工厂模式(工厂模式是非接口,给子类继承的) 用法实现抽象工厂模式的接口
*/
public interface PizzaMaterialFactory {
// 面团
public void createMeterialDough();
// 酱
public void createMeterialSauce();
}
Pizza原料子类实现该接口
package com.su.abstractfactorymode.material;
import com.su.abstractfactorymode.util.Constants;
import android.util.Log;
public class QuanZhouCheesePizzaMeterial implements PizzaMaterialFactory {
@Override
public void createMeterialDough() {
Log.d(Constants.TAG, QuanZhouCheesePizzaMeterial.class.getSimpleName() + " createMeterialDough ");
}
@Override
public void createMeterialSauce() {
Log.d(Constants.TAG, QuanZhouCheesePizzaMeterial.class.getSimpleName() + " createMeterialSauce ");
}
}
抽象BasePizza 基类与Pizza原料相关的接口
这里与原料相关的接口如下
public abstract void prepare();
package com.su.abstractfactorymode.domain;
import com.su.abstractfactorymode.util.Constants;
import android.util.Log;
/**
* 抽象工厂模式
*
*/
public abstract class BasePizza {
public String name;
public abstract void prepare();
public void bark() {
Log.d(Constants.TAG, "2 bark");
}
public void cut() {
Log.d(Constants.TAG, "3 cut");
}
public void box() {
Log.d(Constants.TAG, "4 box");
}
}
Pizza子类建立与Pizza原料的关联
package com.su.abstractfactorymode.domain;
import com.su.abstractfactorymode.material.PizzaMaterialFactory;
import com.su.abstractfactorymode.util.Constants;
import android.util.Log;
public class QuanZhouCheesePizza extends BasePizza {
private PizzaMaterialFactory mPizzaMaterialFactory;
public QuanZhouCheesePizza(PizzaMaterialFactory mPizzaMaterialFactory) {
name = QuanZhouCheesePizza.class.getSimpleName();
this.mPizzaMaterialFactory = mPizzaMaterialFactory;
}
@Override
public void prepare() {
Log.d(Constants.TAG, name + " 1 prepare ");
mPizzaMaterialFactory.createMeterialDough();
mPizzaMaterialFactory.createMeterialSauce();
}
}
结语
上述完成了Pizza的原料解耦的目的,即Pizza的原料工厂可以根据加盟店的特点进行区分化原料供应
调用方法和接口
方法
=========================================================================
BasePizzaStore mQuanZhouPizza = new QuanZhouPizzaStore();
mQuanZhouPizza.orderPizza(Constants.TYPE_CHEESE);
BasePizzaStore mShenZhenPizza = new ShenZhenPizzaStore();
mShenZhenPizza.orderPizza(Constants.TYPE_CHEESE);
=========================================================================
public abstract class BasePizzaStore {
/**
* 工厂模式
*
* 使用方法,继承这个BasePizza类,并实现抽象方法 达到总店BasePizzaStore与加盟店(QuanZhouPizzaStore,
* ShenZhenPizzaStore)的解耦
*/
public abstract BasePizza createPizzaStoreFactory(String type);
public void orderPizza(String type) {
// 从加盟店里得到对应加盟店的Pizza
BasePizza mPizza = createPizzaStoreFactory(type);
mPizza.prepare();
mPizza.bark();
mPizza.cut();
mPizza.box();
}
}
=========================================================================
package com.su.abstractfactorymode.store;
import com.su.abstractfactorymode.domain.BasePizza;
import com.su.abstractfactorymode.domain.QuanZhouCheesePizza;
import com.su.abstractfactorymode.domain.QuanZhouMeatPizza;
import com.su.abstractfactorymode.material.QuanZhouCheesePizzaMeterial;
import com.su.abstractfactorymode.material.QuanZhouMeatPizzaMeterial;
import com.su.abstractfactorymode.util.Constants;
/**
* 泉州加盟店
*/
public class QuanZhouPizzaStore extends BasePizzaStore {
@Override
public BasePizza createPizzaStoreFactory(String type) {
BasePizza mPizza = null;
if (Constants.TYPE_CHEESE.equals(type)) {
// 传入 QuanZhouCheesePizzaMeterial 原料
mPizza = new QuanZhouCheesePizza(new QuanZhouCheesePizzaMeterial());
} else if (Constants.TYPE_MEAT.equals(type)) {
mPizza = new QuanZhouMeatPizza(new QuanZhouMeatPizzaMeterial());
}
return mPizza;
}
}
=========================================================================
运行结果
/**
* 11-18 15:55:00.601: D/suhuazhi(31189): QuanZhouCheesePizza 1 prepare
11-18 15:55:00.601: D/suhuazhi(31189): QuanZhouCheesePizzaMeterial createMeterialDough
11-18 15:55:00.601: D/suhuazhi(31189): QuanZhouCheesePizzaMeterial createMeterialSauce
11-18 15:55:00.601: D/suhuazhi(31189): 2 bark
11-18 15:55:00.602: D/suhuazhi(31189): 3 cut
11-18 15:55:00.602: D/suhuazhi(31189): 4 box
11-18 15:55:00.602: D/suhuazhi(31189): ShenZhenCheesePizza 1 prepare
11-18 15:55:00.602: D/suhuazhi(31189): ShenZhenCheesePizzaMeterial createMeterialDough
11-18 15:55:00.602: D/suhuazhi(31189): ShenZhenCheesePizzaMeterial createMeterialSauce
11-18 15:55:00.602: D/suhuazhi(31189): 2 bark
11-18 15:55:00.602: D/suhuazhi(31189): 3 cut
11-18 15:55:00.602: D/suhuazhi(31189): 4 box
*/
Demo位置
http://download.csdn.net/download/su749520/10123992
结语
工厂模式:继承基类的抽象方法,加盟店例子
抽象工厂模式:定义一个接口,子类实现,并通过工厂方法完成,原料工厂例子