【学习笔记】抽象工厂模式

来源:互联网 发布:mac饥荒汉化mod 编辑:程序博客网 时间:2024/06/08 07:18

前言

本文来自《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

结语

工厂模式:继承基类的抽象方法,加盟店例子
抽象工厂模式:定义一个接口,子类实现,并通过工厂方法完成,原料工厂例子

原创粉丝点击