设计模式1:简单工厂模式

简单工厂模式是当有许多个功能类似的类时,为了隔离客户端代码直接操作这些不同的类,在客户端与多个类中间使用一个工厂类,封装掉这些类的不确定性,给客户端代码提供一个一致的接口。

也就是说,工厂类按照输入的参数,构造一个合适的类返回给客户端。客户端通过父类(或接口)调用。

举一个简单的例子来说,我们要实现一个有加减乘除功能的计算器,由用户输入+ - * /和两个数字,打印计算结果。

在这里,加减乘除是四个功能类似的类,完成的任务都是对两个操作数执行某种运算,然后打印结果。

来看一下UML图:

核心思想在于让不同的操作继承同一个基类Operation,然后各自实现getResult方法。OperationFactory类通过输入参数,返回特定的子类,客户端调用getResult方法。

来看代码,Operation及其子类:

public abstract class Operation {
    private double numA = 0;
    private double numB = 0;
    
    public double getNumA() {
        return numA;
    }

    public void setNumA(double numA) {
        this.numA = numA;
    }

    public double getNumB() {
        return numB;
    }

    public void setNumB(double numB) {
        this.numB = numB;
    }
    
    public abstract double getResult();
}

public class OperationAdd extends Operation {

    @Override
    public double getResult() {
        return getNumA() + getNumB();
    }

}

public class OperationSub extends Operation {

    @Override
    public double getResult() {
        return getNumA() - getNumB();
    }

}

public class OperationMul extends Operation {

    @Override
    public double getResult() {
        return getNumA() * getNumB();
    }

}

public class OperationDiv extends Operation {

    @Override
    public double getResult() {
        return getNumA() / getNumB();
    }

}

OperationFactory类:

public class OperationFactory {
    public static Operation createOperation(String operation) {
        Operation oper = null;
        switch (operation) {
        case "+":
            oper = new OperationAdd();
            break;
        case "-":
            oper = new OperationSub();
            break;
        case "*":
            oper = new OperationMul();
            break;
        case "/":
            oper = new OperationDiv();
            break;
        default:
            throw new IllegalArgumentException ("Unsupport operation!");
        }
        return oper;
    }
}

客户端SimpleFactoryDemo类:

public class SimpleFactoryDemo {
    public static void main(String[] args) {
        if(args.length == 0){
            System.out.println("Usage: java StrategyDemo operation num1 num2");
            return;
        }
        Operation operation = OperationFactory.createOperation(args[0]);
        operation.setNumA(Double.parseDouble(args[1]));
        operation.setNumB(Double.parseDouble(args[2]));
        double result = operation.getResult();
        System.out.println(result);
    }
}

 

posted on 2017-03-30 15:43  一个后端狗  阅读(281)  评论(0编辑  收藏  举报

导航