【学习笔记】工厂模式学习2

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/su749520/article/details/78534261

前言

本文来自《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()灵活变动。

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页