类简单工厂模式-笔记

前言

本文来自《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个独立功能的类而已。明天继续学习看下真正的工厂模式到底是什么?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

法迪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值