一、概念

1、工厂模式分为三类:
(1)简单工厂模式:一个工厂创建所有产品
(2)工厂方法模式:一个工厂方法创建一个产品
(3)抽象工厂模式:一个工厂方法创建一类产品

2、创建型模式
这种模式是指将实例的创建和使用分离开来,隐藏类实例的创建细节,外界对于对象只需要知道它们共同的接口即可。

二、简单工厂模式

1、组成
(1)工厂类:工厂模式的核心,通过调用它来实现其他类的功能。
(2)抽象产品角色
(3)具体产品角色:继承抽象工厂角色,工厂类就是创建此角色的实例。

2、举例
想要说明这个模式,我们可以看一个简单的例子
(1)首先创建一个Operation抽象类,作为抽象产品角色

public abstract class Operation {
    private int operator1;
    private int operator2;

    public int getOperator1() {
        return operator1;
    }

    public int getOperator2() {
        return operator2;
    }

    public void setOperator1(int operator1) {
        this.operator1 = operator1;
    }

    public void setOperator2(int operator2) {
        this.operator2 = operator2;
    }

    protected abstract int getResult();
}

(2)如果我们想要实现加减法运算,可以写一个类继承Operation类,并且重写getResult方法。

public class OperationAdd extends Operation {
    @Override
    public int getResult(){
        return getOperator1() + getOperator2();
    }
}

public class OperationMinus extends Operation {
    @Override
    public int getResult(){
        return getOperator1() - getOperator2();
    }
}

(3)如果我们要进行加减法运算,可以直接调用这两个类创建出的实例的方法,但是简单工厂模式希望我们能够另外建立一个工厂,并且用这个工厂来创建加减法类的实例。因为这样我们就不需要知道具体类的名字,只需要传入加减法的符号即可。

public class Factory {
    public static Operation createOperation(String operator){
        Operation op = null;
        switch (operator){
            case "+":
                op = new OperationAdd();
                break;
            case "-":
                op = new OperationMinus();
                break;
        }
        return op;
    }
}

(4)这样我们的main函数就可以写成这样子。

public static void main(String []args){
        Operation add = Factory.createOperation("+");
        add.setOperator1(100);
        add.setOperator2(60);
        System.out.println(add.getResult());
    }

3、存在的问题
我们可以考虑一下这种方式存在的问题,使用简单工厂模式,可以不用知道具体类的名字,直接交给工厂来创建。

但是这样一来,如果我们想要增加新的运算,即给工厂增加新的产品,首先写新类,还要更改工厂类,增加新的switch判断逻辑,也就不符合开闭原则(对修改关闭,对扩展开放)。

三、工厂方法模式
利用工厂方法模式可以有效解决简单工厂模式破坏开闭原则的问题。
工厂方法模式在简单工厂模式基础上的主要变化在于,增加了一个抽象工厂接口,让每个具体工厂类去实现抽象工厂接口,这样用户就不用关心具体工厂类创建的细节。

1、举例
还是对于运算器这个例子,我们根据工厂模式进行修改。

(1)创建抽象工厂接口

public interface TemplateFactory {
    Operation CreateOperation();
}

(2)创建加法工厂,实现抽象工厂接口

public class AddFactory implements TemplateFactory{
    public Operation CreateOperation(){
        return new OperationAdd();
    }
}

public class MinusFactory implements TemplateFactory{
    public Operation CreateOperation(){
        return new OperationMinus();
    }
}

(3)main函数

    public static void main(String []args){
        TemplateFactory factory = new AddFactory();
        Operation add = factory.CreateOperation();
        add.setOperator1(100);
        add.setOperator2(60);
        System.out.println(add.getResult());
    }
    

使用工厂方法模式,能够实现高度解耦,需要增加新的产品时,只需要增加相关的类和工厂即可,不需要改动已有的产品和工厂。

2、存在的问题
使用工厂方法模式的主要问题在于,每次增加一个产品,都需要新增至少两个类,这会增加系统的复杂性。

四、抽象工厂模式

抽象工厂模式中提到一个产品族的概念,根据前面两个工厂模式,简单工厂是一个工厂“生产”所有产品,工厂方法是一个工厂生产一个产品。
抽象工厂就是一个工厂生产一个产品族,产品族这个概念,是指位于不同产品等级结构中,功能相关的产品组成的家族。

1、举例
比如我们现在两个产品族,HUAWEI手机族和XIAOMI手机族,两个族中又分别包含商务机和时尚机这两种不同产品等级的手机类型,那么我们需要建立两个工厂:HUAWEI工厂和XIAOMI工厂,每个工厂里又分别提供生产商务机和时尚机。这里就不通过代码来说明了。

五、总结

工厂模式的主要目的,就是为了将实例对象的创建和使用分开,所以工厂干的事情,就是实例化对象。
而三种方式的联系可以通过这张图来帮助理解。
http://www.hollischuang.com/w...

参考:
http://www.hollischuang.com/w...
你以为工厂模式很简单,可能是因为你懂的只是冰山的一角


hushucheng
42 声望2 粉丝