设计模式--工厂模式

一、简单工厂模式
购买披萨的例子

1:不同披萨的从准备到打包出售的流程一致,只是准备阶段的材料不同,可把流程放到抽象类中,然后不同的pizza重写基类的prepare方法

public abstract class Pizza {
    protected String name;

    public void prepare() {
        System.out.println("prepare--" + name);
    }

    public void bake() {
        System.out.println("bake--" + name);
    }

    public void cut() {
        System.out.println("cut--" + name);
    }

    public void pack() {
        System.out.println("pack--" + name);
    }

    public void setName(String name) {
        this.name = name;
    }
}

public class CheesePizza extends Pizza{
    @Override
    public void prepare() {
        System.out.println("Cheese Pizza ...start");
    }
}

public class GreekPizza extends Pizza{
    @Override
    public void prepare() {
        System.out.println("Greek Pizza ...start");
    }
}

订单制作模块,根据客户订单类型不同,创建其对应的pizza

public class OrderPizza {
    private String type;

    public OrderPizza(String type) {
        this.type = type;
        Pizza pizza = null;
        if (type == "cheese") {
            pizza = new CheesePizza();
            pizza.setName("cheese");

        } else if (type == "greek") {
            pizza = new GreekPizza();
            pizza.setName("greek");

        }

        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.pack();
    }

}

测试模块

public class PizzaStore {
    public static void main(String[] args) {
        OrderPizza orderPizza = new OrderPizza("cheese");
    }
}

以上是简单的工厂模式,但是如果新增不同类型的pizza和不同产地的pizza,需要修改OrderPizza模块,不符合的设计模式的职责单一与开闭原则。
优化:
在这里插入图片描述
Pizza不做修改

OrderPizza 负责pizza制作流程,不做分类处理

public class OrderPizza {
    IPizzaFactory iPizzaFactory;


    public OrderPizza(IPizzaFactory iPizzaFactory, String type) {
        this.iPizzaFactory = iPizzaFactory;
        Pizza pizza = iPizzaFactory.createPizza(type);
        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.pack();
    }

}

提供对外实现的方法

public interface IPizzaFactory {
    public  Pizza createPizza(String type);
}

不同产地的口味调度

public class LDPizza implements IPizzaFactory{
    @Override
    public Pizza createPizza(String type) {
        if (type == "cheese") {
            return new LDCheesePizza();
        } else {
            return new LDGreekPizza();
        }
    }
}

LDCheesePizza,LDGreekPizza 只需要修改prepare即可

public class LDCheesePizza extends Pizza{
    @Override
    public void prepare() {
        super.setName("LD奶酪披萨");
        System.out.println("LD奶酪披萨 Pizza ...start");
    }
}

public class PizzaStore {
    public static void main(String[] args) {
        new OrderPizza(new BJPizza(), "cheese");
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值