详细易懂的工厂模式笔记

193 阅读3分钟

  工厂模式的核心就是不用new来新建对象,将调用者和创建对象的过程解耦。本文中将介绍工厂模式下的三类划分,并且分析其优点和不足之处。

1.简单工厂模式

  示例代码如下,对于实现了同一接口的一类产品,可以利用factory方法来完成对它们的创建和返回,如果构造方法比较复杂,就在工厂方式里完成配置,在外部使用时就会简单得多。同时新增其他产品时也只需要增加对应代码即可

public class GoodsFactory {

    public GoodsFactory(){

    }
    public static Product getProduct(String name){
        switch (name){
            case "goods1":
                return new Goods1();
            case "goods2":
                return new Goods2();
            default:
                System.out.println("工厂异常");
                break;
        }
        return null;
    }

}

interface Product{
    void doFunc();
}

class Goods1 implements Product{

    @Override
    public void doFunc() {
        System.out.println("111");
    }
}

class Goods2 implements Product{

    @Override
    public void doFunc() {
        System.out.println("222");
    }
}

  简单工厂方法的缺点就是,每次要新增产品,都需要修改工厂方法中的getProduct方法。一般来说写好的代码尽量不要修改,即应该对修改封闭,对扩展开放,故简单工厂模式还可以进一步修改为工厂方法模式。

2.工厂方法模式

  说白了就是,为了避免每次新增产品都要去修改getProduct方法,那干脆对于每一个产品都创建一个专属于自己的工厂就好了。打个比方,简单工厂方法好比我有一个厂子,它生产帽子和鞋,那如果我想它生产衬衫就要在工厂内部加一条衬衫流水线。但是工厂方法模式相当于我有好几个厂子,第一个生产帽子,第二个生产鞋,如果现在要生产衬衫就再加一个工厂来专门生产衬衫,这样就不用修改已有的工厂了。

public class GoodsFactory {

    public static void main(String[] args) {
        Product goods1=new Factory1().getProduct();
        Product goods2=new Factory2().getProduct();

        goods1.doFunc();
        goods2.doFunc();

    }


}

interface Product{
    void doFunc();
}

class Goods1 implements Product{

    @Override
    public void doFunc() {
        System.out.println("111");
    }
}

class Goods2 implements Product{

    @Override
    public void doFunc() {
        System.out.println("222");
    }
}

interface Factory{
    Product getProduct();
}

class Factory1 implements Factory{
    @Override
    public Product getProduct() {
        return new Goods1();
    }
}

class Factory2 implements Factory{
    @Override
    public Product getProduct() {
        return new Goods2();
    }
}

  这样的代码更符合设计原则,扩展性更强,但是代码量会大大增加。一般来说,实际使用中不如简单工厂模式。

3.抽象工厂方法

  抽象的抽象,进一步抽象工厂方法模式,再抽象出一层来,创建一个工厂接口,并且让所有工厂实现该接口,最后用一个超级工厂来创建所有的工厂。正如简单工厂模式中,对于实现了同样接口的产品,用一个工厂来生产它们。在抽象工厂方法中,对于实现了同一个接口的工厂(即,同一族的工厂),也用一个接口来联合起来。当用户需要一件衣服时,可以从生产红色短袖和蓝色衬衫的工厂中自由选择————因为它们都实现了衣服工厂这个接口。