设计模式 一、简单工厂模式

运用一个单独的 OperationFactory 类,来做创造 Operation 运算符 实例的过程,便是简单工厂模式。

其中加减乘除运算符都是运用了面向对象的继承特性,需要添加开方或者sin函数运算只需要多继承一个而不需要改动原有的代码,更改其中一个只需在本身的类里更改。

封装特性体现在运算类与客户端的界面显示分离

也可用接口实现,更为灵活,这里主要体现简单工厂模式的用法

//运算符基类
public class Operation {
    
    
    protected double _numA;
    protected double _numB;
    protected double _result;

    public double get_numA() {
    
    
        return _numA;
    }

    public void set_numA(double _numA) {
    
    
        this._numA = _numA;
    }

    public double get_numB() {
    
    
        return _numB;
    }

    public void set_numB(double _numB) {
    
    
        this._numB = _numB;
    }

    public double GetResult() throws Exception {
    
    
        return _result;
    }
}

//运算符子类,重写运算方法
public class OperationAdd extends Operation{
    
    
    @Override
    public double GetResult() {
    
    
        return this._numA+this._numB;
    }
}

public class OperationSub extends Operation{
    
    
    @Override
    public double GetResult() {
    
    
        return this._numA-this._numB;
    }
}

public class OperationMul extends Operation{
    
    
    @Override
    public double GetResult() {
    
    
        return this._numA*this._numB;
    }
}

public class OperationDiv extends Operation {
    
    
    @Override
    public double GetResult() throws Exception {
    
    
        if (this._numB == 0) {
    
    
            throw new Exception("除数不能为0");
        }
        return this._numA / this._numB;
    }
}

简单工厂模式

//简单工厂模式,用于创造运算符实例
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;
        }
        return oper;
    }

    //界面和运算业务分离,封装特性
    public static void main(String[] args) {
    
    
        try {
    
    
            Scanner sc = new Scanner(System.in);
            System.out.println("请输入数字A");
            String numA = sc.next();
            System.out.println("请输入运算符 + - * /");
            String operation = sc.next();
            System.out.println("请输入数字B");
            String numB = sc.next();

            Operation oper = OperationFactory.CreateOperation(operation);
            oper.set_numA(Double.valueOf(numA));
            oper.set_numB(Double.valueOf(numB));

            System.out.printf("结果是  %f", oper.GetResult());
        } catch (Exception e) {
    
    
            e.printStackTrace();
        }
    }

}



猜你喜欢

转载自blog.csdn.net/weixin_45401129/article/details/114628947