大数据

设计模式系列之五工厂模式

Java实现

简单工厂

  简单工厂应该是最简单的工厂方法了,也是最常见的。下面,通过代码就知道为什么这么说了。

public class SimplePizzaFactory {

    public Pizza createPizza(String type) {
        Pizza pizza = null;

        if (type.equals("cheese")) {
            pizza = new CheesePizza();
        } else if (type.equals("pepperoni")) {
            pizza = new PepperoniPizza();
        } else if (type.equals("clam")) {
            pizza = new ClamPizza();
        } else if (type.equals("veggie")) {
            pizza = new VeggiePizza();
        }
        return pizza;
    }
}
public class PizzaStore {
    SimplePizzaFactory factory;

    public PizzaStore(SimplePizzaFactory factory) {
        this.factory = factory;
    }

    public Pizza orderPizza(String type) {
        Pizza pizza;
        //通过简单工厂创建不同类型的披萨
        pizza = factory.createPizza(type);

        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();

        return pizza;
    }
}

  通过简单工厂方法,有效的把new Object()解耦了出来。在实际的业务中,不用再去关心如何去创建对象。特别是对象的创建与初始化很复杂,且有很多地方都需要用到该对象时,就不用每个地方都去显示的new一下,要修改初始化条件时,也只需要修改工厂方法即可。

工厂方法

定义:

工厂方法模式:定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。

public abstract class PizzaStore {

    //具体如何创建披萨交由子类去实现(注意对比这里跟简单工厂的区别)
    abstract Pizza createPizza(String item);

    public Pizza orderPizza(String type) {
        Pizza pizza = createPizza(type);
        System.out.println("--- Making a " + pizza.getName() + " ---");
        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();
        return pizza;
    }
}
//纽约风格的披萨
public class NYPizzaStore extends PizzaStore {

    Pizza createPizza(String item) {
        if (item.equals("cheese")) {
            return new NYStyleCheesePizza();
        } else if (item.equals("veggie")) {
            return new NYStyleVeggiePizza();
        } else if (item.equals("clam")) {
            return new NYStyleClamPizza();
        } else if (item.equals("pepperoni")) {
            return new NYStylePepperoniPizza();
        } else return null;
    }
}
//芝加哥风格的披萨
public class ChicagoPizzaStore extends PizzaStore {

    Pizza createPizza(String item) {
            if (item.equals("cheese")) {
                    return new ChicagoStyleCheesePizza();
            } else if (item.equals("veggie")) {
                    return new ChicagoStyleVeggiePizza();
            } else if (item.equals("clam")) {
                    return new ChicagoStyleClamPizza();
            } else if (item.equals("pepperoni")) {
                    return new ChicagoStylePepperoniPizza();
            } else return null;
    }
}

抽象工厂

  在所有的工厂模式中,还有一种叫抽象工厂模式。不过一直无法理解抽象工厂模式的具体使用场景,所以这部分留着今后对抽象工厂模式理解深刻了再来总结吧。

Javascript实现

简单工厂

  举一个如下的业务场景:需要开发一个表单生成器,需要做到表单元素的自动生成。那么,可以采用简单工厂来创建表单元素对象。

(function () {
    function SampleFormFactory() {

    }
    SampleFormFactory.fn = SampleFormFactory.prototype;
    SampleFormFactory.fn.getFormElement = function (type) {
        switch (type){
            case "Input":
                return new Input();
            case "Select":
                return new Select();
            case "Textarea":
                return new Textarea();
            case "Radio":
                return new Radio();
            case "Checkbox":
                return new Checkbox();
        }
    };

    /*****************标准表单对象*****************/
    function Input() {

    }
    function Select() {

    }
    function Textarea() {

    }
    function Radio() {

    }
    function Checkbox() {

    }

    //使用简单工厂创建表单元素
    var factory = new SampleFormFactory();
    var element = factory.getFormElement("Input");
})();

  至于在javascript中工厂方法模式的使用,一时想不到使用场景,感觉有点为了用设计模式而设计模式,所以这里就不再举例了。

上一篇:设计模式系列之四装饰者模式
下一篇:设计模式系列之六命令模式