设计模式学习笔记:工厂模式

Posted 滴滴哒滴哒

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式学习笔记:工厂模式相关的知识,希望对你有一定的参考价值。

      工厂模式是一种很常见的设计模式,主要讨论的问题在于类的实例化。每当我们应用的时候,我们总要去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模块进行修改,可以预见的是这种方法缺乏弹性。

以上是关于设计模式学习笔记:工厂模式的主要内容,如果未能解决你的问题,请参考以下文章

java/android 设计模式学习笔记---工厂方法模式

设计模式学习笔记(十一:抽象工厂模式)

工厂模式&抽象工厂——HeadFirst设计模式学习笔记

设计模式:学习笔记——抽象工厂模式

《Head First 设计模式》学习笔记——工厂模式 + 抽象工厂模式

简单工厂模式 - 学习笔记