工厂模式

  工厂模式在java里面也是用到的特别多了,但是在写这篇博客的时候我纠结了几十分钟,比如我的代码中很多地方需要用到一个对象Interface a = new A(),但是假如我业务需求变了,我现在不想要用A了,想要用Interface  a=new B()。那么我不管使不使用工厂模式,我都必须要去改原有代码,那么工厂模式的意义在哪? 后来一想,我这里实例话的是一个简单对象,new一下就搞定了,如果我实例话的对象非常复杂,可能需要许多行代码,那么改代码的时候这许多行代码都需要改,而使用工厂模式最少只需要改一行代码就可以了。

  工厂模式的使用场景:

    工厂模式是一种创建类模式,在任何需要创建复杂对象的地方,都可以使用工厂模式,但是如果只是简单对象,new就可以了,使用工厂模式反而会增加系统复杂度。

  工厂模式的好处:

    1. 解耦合,上层模块只需要知道产品的抽象类,而不需要去关心他的实现类。

    2. 扩展性好,在增加产品类的情况下,只需要去更改工厂类或者添加一个工厂类就好了。

  工厂模式的坏处:

    需要一个接口和这个接口的实现类来作为工厂方法的载体,可能会多出一个类层次。

  几种工厂模式以及实现代码:

1. 简单工厂模式

/**
 * created by xushilong on 2018/10/9.
 */
public interface Shape {

    String draw();
}
/**
 * created by xushilong on 2018/10/9.
 */
public class Circle implements Shape {
    @Override
    public String draw() {
        return "this is circle";
    }
}
/**
 * created by xushilong on 2018/10/9.
 */
public class Square implements Shape {
    @Override
    public String draw() {
        return "this is square";
    }
}
/**
 * created by xushilong on 2018/10/9.
 */
public class SimpleFactory {

    public Shape create(String type) {
        if (type.equals("CIRCLE")) {
            return new Circle();
        } else if (type.equals("SQUARE")) {
            return new Square();
        } else {
            return null;
        }
    }
}

这里我们创建了一个Shape接口,里面有draw方法,然后有两个实现类Circle和Square,通过SimpleFactory的create()方法指定type就可以创建你想要的对象了,但是这种实现方法的缺点就是如果有多个产品类,create方法里面就要有多少个if else,看上去不美观,而且有返回null的可能。

2. 多个工厂方法模式

/**
 * created by xushilong on 2018/10/9.
 */
public class MultiMethodFactory {

    public Circle createCircle() {
        return new Circle();
    }

    public Square createSquare() {
        return new Square();
    }
}

多个工厂方法模式算是对简单工厂模式的一个改进。提供多个工厂方法来分别创建对象。

3. 静态工厂方法模式

这个没啥好说的,就是将工厂方法用static修饰,这样调用的时候就不用实例化工厂对象而是直接调用了

4. 抽象工厂方法模式

/**
 * created by xushilong on 2018/10/9.
 */
public interface Provider {

    Shape create();
}
/**
 * created by xushilong on 2018/10/9.
 */
public class SquareFactory implements Provider {
    @Override
    public Shape create() {
        return new Square();
    }
}
/**
 * created by xushilong on 2018/10/9.
 */
public class CircleFactory implements Provider {
    @Override
    public Shape create() {
        return new Circle();
    }
}

上面的几种实现方法,如果我添加了产品类,那么我不可避免的需要去更改工厂类的方法,这违背了闭包原则。所以,从设计角度考虑,有一定的问题,如何解决?抽象工厂模式可以,从代码中可以看出,这种实现方式多加了一层抽象工厂,原来的工厂变成了抽象工厂的实现类,这样如果新添加了产品类,只需要新添加一个抽象工厂的实现类,而不需要去更改工厂类的方法。

posted @ 2018-10-09 20:19  徐世龙  阅读(115)  评论(0)    收藏  举报