设计模式学习之——简单工厂

在真正的工厂方法之前,先学习下简单的工厂思想。

假定你是pizza店的老板

现在有一个pizza 类

public abstract class Pizza {
    public void prepare(){
        System.out.println("准备开始做");
    }
    public void bake(){
        System.out.println("准备烘焙");
    }
    public void cut(){
        System.out.println("开始切");
    }

}

有几种Pizza

public class CheesePizza extends Pizza {
CheesePizza (){
    this.name="cheese";
}

}

public class PepperonPizza extends Pizza{
    PepperonPizza(){
        this.name="Pepperon";
    }
}
public class DefaultPizza  extends Pizza{
    public DefaultPizza() {
        this.name="default";
    }
}

订单

public class OrderPizza {
Pizza p;
public OrderPizza(String type) {
    if(type.equals("cheese")){
        p=new CheesePizza();
    }
    else if(type.equals("pepperonPizza")){
        p=new PepperonPizza();
    }else{
        p=new DefaultPizza();
    }

    p.prepare();
    p.bake();
    p.cut();

}

}

测试类

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

}

准备开始做cheesepizza
准备烘焙
开始切

那么现在的问题是什么呢?

如果加入新的pizza种类的话,不得不修改Order类、
每一次都涉及到修改

也就是if判断这一段

而后面的流程都是没有涉及到改变的。

解决办法 -封装创建对象的代码

首先创建一个工厂类

public class SimplePizzaFactory {
    public Pizza creatPizza(String type){
        Pizza p;
        if(type.equals("cheese")){
            p=new CheesePizza();
        }
        else if(type.equals("pepperonPizza")){
            p=new PepperonPizza();
        }else{
            p=new DefaultPizza();
        }
        return p;

    }
}

然后修改OrederPizaa

public class OrderPizza {
    Pizza p;
    public OrderPizza(String type) {
        p=new SimplePizzaFactory().creatPizza(type);//change
        p.prepare();
        p.bake();
        p.cut();

    }

}

好处:

简单的说,工厂类并不仅仅服务于一个OrderPizza,每一个都可以用这个工厂,不用自己去涉及到修改
每次修改都会成为全局的修改

当然这仅仅是一个简答的工厂模式,还不算是真正的设计模式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值