设计模式学习笔记(5):工厂模式(1)

      工厂模式是一种很常见的设计模式,主要讨论的问题在于类的实例化。每当我们应用的时候,我们总要去new(实例化)一个对象。这是一个必须也很常见的过程,但是当我们要增加新的具体类型,就必须改变原有代码。这给我们的扩展造成巨大的不便。

      如何改变这种情况呢?这时候就要用到工厂模式了。

      工厂模式定义了一个创建对象的接口,但是由子类决定要实例化的是哪一个。工厂方法让类把实例化推迟到子类进行。通过这种模式,我们不用具体去管工厂里“产品”具体是怎样制作的。实现了“解耦”。

      但是缺点就是:每当我新增一类的产品,我们都需要去增加一个工厂和产品,这样我们系统的类的数量会成倍增加,系统复杂度上升,同时也增加了系统具体类的依赖。需要我们酌情使用。      


 简单工厂模式

      简单工厂模式并算不上一种“设计模式”,但也算一种比较常见的使用方案。简单工厂模式只是将对象的创建封装起来,并不具备工厂方法的弹性。

在这里我们拿一个PizzaStore来做例子。          

public class PizzaStore {
    public Pizza orderPizza(String type){
        //实例化Pizza类,可变的
        Pizza pizza = null;
        if (type.equals("cheese")){
            pizza = new CheesePizza();
        }else if (type.equals("greek")){
            pizza = new GreekPizza();
        }else if (type.equals("pepperoni")){
            pizza = new PepperoniPizza();
        }

        //Pizza固定制作流程
        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();
        return pizza;
    }
}

       面对生产多种Pizza种类的工厂,我们初期的想法可能就像上面一样,把Pizza类的实例化放在代码中,但是这样的代码并未对修改进行封闭,一旦我们需要加入新的Pizza种类,就必须要改动原有代码(这种做法是不安全的,改动现有的代码可能会有Bug产生的风险,对于其他关联的模块可能会造成不可预估的影响)。我们首先把可能发生变化的部分与不会发生变化的部分进行分离。
public class SimplePizzaFactory {
    public Pizza createPizza(String type){
        Pizza pizza = null;
        if (type.equals("cheese")){
            pizza = new CheesePizza();
        }else if (type.equals("greek")){
            pizza = new GreekPizza();
        }else if (type.equals("pepperoni")){
            pizza = new PepperoniPizza();
        }
        return pizza;
    }
}
public class PizzaStore {
    SimplePizzaFactory factory;
    //PizzaStore的构造器将SimplePizzaFactory作为参数
    public PizzaStore(SimplePizzaFactory factory){
        this.factory = factory;
    }

    public Pizza orderPizza(String type){
        Pizza pizza = null;
        //我们将new变化成了工厂的方法
        pizza = factory.createPizza(type);

        //Pizza固定制作流程
        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();
        return pizza;
    }
}
我们简单的把原有PizzaStore里的可变部分(实例化部分)和固定部分进行了分离,这样就构成了一个简单工厂。这个方案下,我们至少把实例部分从我们业务逻辑部分分离。但是这里的factory是一个具体的类,业务扩展的时候还是要去对factory模块进行修改,可以预见的是这种方法缺乏弹性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值