其他分享
首页 > 其他分享> > 大话设计模式之简单工厂模式学习

大话设计模式之简单工厂模式学习

作者:互联网

1:简单工厂模式入门

1.1:如何设计一个面向对象的计算器小程序

  既然我们学习了面向对象的编程语言,那该怎么使用该语言来实现我们的编程尼?要记住OOB的三个特性,封装,继承,多态!!!

我们通过设计一个基类Operation,然后通过在继承出来4个加减乘除的方法类,来供我们使用,这样子在后序的增加和修改功能的时候,可以很方法。如果把所有功能坐在一个类里面的话,比如用swithc case语句,则必须在打开修改原代码的情况下,才能增加新的功能。

package sampleFactoryParttern;

import jdk.nashorn.internal.runtime.ECMAException;

import java.util.Scanner;

/**
 * @author :dazhu
 * @date :Created in 2020/4/2 10:40
 * @description:简单工厂模式学习
 * @modified By:
 * @version: $
 */
public class Main {
    public static void main(String[]args){
        Opeartion op = null;
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入numberA");
        double numberA = sc.nextDouble();
        System.out.println("请输入numberB");
        double numberB = sc.nextDouble();
        System.out.println("请输入运算符");
        char opera = sc.next().charAt(0);
        switch (opera){
            case '+':{
                op = new OperationAdd(numberA,numberB);
                break;
            }
            case '-':{
                op = new OperationSub(numberA,numberB);
                break;
            }
            case '*':{
                op = new OperationMul(numberA,numberB);
                break;
            }
            case '/':{
                op = new OperationDiv(numberA,numberB);
                break;
            }
            default: op = new OperationAdd(numberA,numberB);
        }
        try {
            System.out.println("结果为:" + op.getResult());
        }
        catch (Exception ex){
            System.out.println("除法运算中被除数不能为0!");
            ex.printStackTrace();
        }
    }
}
//基类,包含两个操作数,和一个计算方法
class Opeartion{
    public double numberA = 0;
    public double numberB = 0;
    //构造方法
    public Opeartion(double numberA,double numberB){
        this.numberA = numberA;
        this.numberB = numberB;
    }
    //该方法可能在被除数为0时,抛出异常。
    public double getResult() throws Exception {
        double result = 0;
        return result;
    }
}

//加法类
class OperationAdd extends Opeartion{

    //构造方法
    public OperationAdd(double numberA, double numberB){
        super(numberA,numberB);
    }
    public double getResult(){
        double result = numberA + numberB;
        return result;
    }
}
//减法类
class OperationSub extends Opeartion{

    //构造方法
    public OperationSub(double numberA, double numberB){
        super(numberA,numberB);
    }
    public double getResult(){
        double result = numberA - numberB;
        return result;
    }
}

//乘法类
class OperationMul extends Opeartion{

    //构造方法
    public OperationMul(double numberA, double numberB){
        super(numberA,numberB);
    }
    public double getResult(){
        double result = numberA * numberB;
        return result;
    }
}

//除法类
class OperationDiv extends Opeartion{

    //构造方法
    public OperationDiv(double numberA, double numberB){
        super(numberA,numberB);
    }
    public double getResult() throws Exception{
        double result = 0;
        if(numberB == 0){
            throw new Exception("除数不能为0!");
        }
        result = numberA / numberB;
        return result;
    }
}

经过我们上面的改写发现,如果要增加不同的计算功能,比如开方,立方等等,只需要继承出来不同的计算功能类就可以了,同时修改main方法里的逻辑即可。

1.2:进一步优化

我们上面通过在本地main方法中内部通过switch() case 语句来进行创建不同功能的实例,这种方法显然不满足面向对象的思想,如果通过一个其他对象将创建计算功能实例的功能封装到一个类的内部,而避免暴露出来其内部逻辑尼?我们使用如下方法简单工厂类的方法来实现。

package sampleFactoryParttern;

import jdk.nashorn.internal.runtime.ECMAException;

import java.util.Scanner;

/**
 * @author :dazhu
 * @date :Created in 2020/4/2 10:40
 * @description:简单工厂模式学习
 * @modified By:
 * @version: $
 */
public class Main {
    public static void main(String[]args){

        Opeartion op = OperationFactory.createOpeartion('/');
        op.numberA = 10;
        op.numberB = 20;
        try {
            System.out.println("结果为:" + op.getResult());
        }
        catch (Exception ex){
            System.out.println("除法运算中被除数不能为0!");
            ex.printStackTrace();
        }
    }
}
//基类,包含两个操作数,和一个计算方法
class Opeartion{
    public double numberA = 0;
    public double numberB = 0;
//    //构造方法
//    public Opeartion(double numberA,double numberB){
//        this.numberA = numberA;
//        this.numberB = numberB;
//    }
    //该方法可能在被除数为0时,抛出异常。
    public double getResult() throws Exception {
        double result = 0;
        return result;
    }
}

//加法类
class OperationAdd extends Opeartion{

//    //构造方法
//    public OperationAdd(double numberA, double numberB){
//        super(numberA,numberB);
//    }
    public double getResult(){
        double result = numberA + numberB;
        return result;
    }
}
//减法类
class OperationSub extends Opeartion{
//
//    //构造方法
//    public OperationSub(double numberA, double numberB){
//        super(numberA,numberB);
//    }
    public double getResult(){
        double result = numberA - numberB;
        return result;
    }
}

//乘法类
class OperationMul extends Opeartion{

//    //构造方法
//    public OperationMul(double numberA, double numberB){
//        super(numberA,numberB);
//    }
    public double getResult(){
        double result = numberA * numberB;
        return result;
    }
}

//除法类
class OperationDiv extends Opeartion{

//    //构造方法
//    public OperationDiv(double numberA, double numberB){
//        super(numberA,numberB);
//    }
    public double getResult() throws Exception{
        double result = 0;
        if(numberB == 0){
            throw new Exception("除数不能为0!");
        }
        result = numberA / numberB;
        return result;
    }
}

//简单工厂类,将创建计算对象放在类的内部,避免暴露内部创建计算对象的逻辑。
class OperationFactory{
    public static Opeartion createOpeartion(char opera){
        Opeartion op = null;
        switch (opera){
            case '+':{
                op = new OperationAdd();
                break;
            }
            case '-':{
                op = new OperationSub();
                break;
            }
            case '*':{
                op = new OperationMul();
                break;
            }
            case '/':{
                op = new OperationDiv();
                break;
            }
            default: op = new OperationAdd();
        }
        return op;
    }
}

这种情况下,我们当要增加一种新的计算功能时,就可以只增加一个功能对象,同时修改简单工厂类的switch代码就可以的。

1.3:类图分析

 

标签:numberB,numberA,double,大话,工厂,result,设计模式,public,op
来源: https://www.cnblogs.com/dazhu123/p/12618681.html