ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2020-04-02 12:08:24  阅读:232  来源: 互联网

标签:numberB numberA double 大话 工厂 result 设计模式 public op


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有