java 简单工厂模式之计算器的实现Swing 版本的实现

 

1.Operation计算类(抽象类,让所有的计算方式来继承)

package 计算器;

/**
 * @author 魏榕汘
 * @date 2020/11/2 - 16:51
 * 运算类
 *
 */
public abstract class Operation {
    protected double numberA=0;//输入 A和B
    protected double numberB=0;
    protected double result=0;//计算结果

    public abstract double getResult();//抽象方法

    public void setNumberA(double numberA) {//封装get  set方法
        this.numberA = numberA;
    }

    public void setNumberB(double numberB) {
        this.numberB = numberB;
    }

//    public void setResult(double result) {
//        this.result = result;
//    }

    public double getNumberA() {
        return numberA;

    }

    public double getNumberB() {
        return numberB;
    }

//    public double getResult() {
//        return result;
//    }

}

2.

2.1 加法类继承Operation抽象类,并实现抽象方法:

package 计算器;

/**
 * @author 魏榕汘
 * @date 2020/11/2 - 16:58
 * 加法运算
 */
public class OperationAdd extends Operation{


    @Override
    public double getResult() {//实现抽象方法,下同
//        double result=0;
        result=numberA-numberB;
        return result;
    }
}

2.2减法类继承Operation抽象类,并实现抽象方法:

package 计算器;

/**
 * @author 魏榕汘
 * @date 2020/11/2 - 16:58
 */
public class OperationSub extends Operation {
    @Override
    public double getResult(){
//    double result=0;
    result=numberA-numberB;
    return result;
    }
}

2.3乘法类继承Operation抽象类,并实现抽象方法:

package 计算器;

/**
 * @author 魏榕汘
 * @date 2020/11/2 - 16:59
 */
public class OperationMul extends Operation {
    @Override
    public double getResult() {
//        double result=0;
        result=numberA*numberB;
        return result;
    }
}

2.4除法类继承Operation抽象类,并实现抽象方法:这里面需要进行异常的捕捉,判断B是否为零!!!

package 计算器;

/**
 * @author 魏榕汘
 * @date 2020/11/2 - 16:59
 */
public class OperationDiv extends Operation {
    @Override
    public double getResult() {//对异常的捕捉
        try {
            result=numberA/numberB;
        }catch (Exception e){
            System.out.println("除数不能为零");
            e.printStackTrace();
        }
        return result;
    }
}
//或者这样写
//if(getNumber()==0){
// sout"除数不能为零"
// }
//else{
// return getA()/getB()}

3 .工厂类:进行运算加减乘除操作的选择!!!java数据类型可以是类、接口和数组,在这里是引用数据类型。OPeration是  类型
 

package 计算器;

/**
 * @author 魏榕汘
 * @date 2020/11/2 - 17:15
 * 工厂类
 */


public class OperationFactory {
    public static Operation creatOpeation(char option){//java数据类型可以是类、接口和数组,在这里是引用数据类型。OPeration是类  类型
            //switch进行选择操作
            Operation operation=null;//类 类型  声明数据类型并且进行空赋值
            switch (option){
                case '+':
                    operation=new OperationAdd();
                    break;
                case '-':
                    operation=new OperationSub();
                    break;
                case '*':
                    operation=new OperationMul();
                    break;
                case '/':
                    operation=new OperationDiv();
                    break;
            }


            return operation;
    }
}

4.swing实现类。需要一定的swing知识。推荐我要自学网进行学习

package 计算器;

import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

/**
 * @author 魏榕汘
 * @date 2020/11/2 - 17:22
 */
public class CalculateFrame extends JFrame {
    private JPanel mb1,mb2,mb3,mb4,mb5,mb6;//面板的拼音  mb  下同
    private JLabel bq1,bq2,bq3,bq4,bq5;//拼音的首字母
    private JButton an1,an2;
    private JTextField wb1,wb2,wb3;
    private JRadioButton dx1,dx2,dx3,dx4;
    private Operation oper//引用数据类型

    private String numberA,numberB,operation;
    private double resultNum;

    public CalculateFrame(){
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       // this.setResizable(false);
        this.setLocationRelativeTo(null);
        this.setSize(600,600);
        this.setVisible(true);

        bq1=new JLabel("简单计算器的实现(工厂模式)",bq1.CENTER);
        bq1.setFont(new Font("楷体",Font.BOLD,30));
        bq1.setForeground(Color.blue);

        bq2=new JLabel("请输入第一个数:");
        bq2.setFont(new Font("楷体",Font.BOLD,20));
        bq3=new JLabel("请输入第二个数:");
        bq3.setFont(new Font("楷体",Font.BOLD,20));
        bq4=new JLabel("运算结果显示:");
        bq4.setFont(new Font("楷体",Font.BOLD,20));
        bq5=new JLabel("请选择:");
        bq5.setFont(new Font("楷体",Font.BOLD,20));


        an1=new JButton("开始计算");
        an1.setFont(new Font("楷体",Font.BOLD,20));
        an1.addActionListener(new ButtonListener());
        an1.setSize(30,30);

        an2=new JButton("重置");
        an2.setFont(new Font("楷体",Font.BOLD,20));
        an2.setSize(30,30);
        an2.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                wb1.setText("");
                wb2.setText("");
                wb3.setText("");

            }
        });

        wb1=new JTextField(10);
        wb2=new JTextField(10);
        wb3=new JTextField(10);
        wb3.setEnabled(false);//结果框不能输入文字和数字

        dx1=new JRadioButton("+(加)");
        dx2=new JRadioButton("-(减)");
        dx3=new JRadioButton("*(乘)");
        dx4=new JRadioButton("/(除)");

        mb1=new JPanel(new GridLayout(1,1));
        mb1.add(bq1);

        mb2=new JPanel(new GridLayout(1,2));
        mb2.add(bq2); mb2.add(wb1);
        mb2.setBorder(new EmptyBorder(10,10,10,10));

        mb3=new JPanel(new GridLayout(1,4));
       mb3.add(bq5); mb3.add(dx1);mb3.add(dx2);mb3.add(dx3); mb3.add(dx4);
        mb3.setBorder(new EmptyBorder(10,10,10,10));

        mb4=new JPanel(new GridLayout(1,2));
        mb4.add(bq3);mb4.add(wb2);
        mb4.setBorder(new EmptyBorder(10,10,10,10));

        mb5=new JPanel(new GridLayout(1,2));
        mb5.add(bq4); mb5.add(wb3);
        mb5.setBorder(new EmptyBorder(10,10,10,10));

        mb6=new JPanel(new GridLayout(1,2));
        mb6.add(an1);mb6.add(an2);



        this.setLayout(new GridLayout(6,1));
//
//        mb1.add(bq1);
//
//        mb2.add(bq2); mb2.add(wb1);
//
//        mb3.add(dx1);mb3.add(dx2);mb3.add(dx3); mb3.add(dx4);
//
//        mb4.add(bq3);mb4.add(wb2);
//
//        mb5.add(bq4); mb5.add(wb3);
//
//        mb6.add(an1);mb6.add(an2);

        this.add(mb1);
        this.add(mb2);
        this.add(mb3);
        this.add(mb4);
        this.add(mb5);
        this.add(mb6);


        ButtonGroup group=new ButtonGroup();
        group.add(dx1);
        group.add(dx2);
        group.add(dx3);
        group.add(dx4);
    }



    public static void main(String[] args) {
        new CalculateFrame().setVisible(true);

    }

    class ButtonListener implements ActionListener{
        //从程序中读入数据
        public void actionPerformed(ActionEvent e) {
            numberA=wb1.getText();
            numberB=wb2.getText();

            operation="";
            if (dx1.isSelected()){
                operation=dx1.getText();
            }else if (dx2.isSelected()){
                operation=dx2.getText();
            }else if (dx3.isSelected()){
                operation=dx3.getText();
            }else if (dx4.isSelected()){
                operation=dx4.getText();
            }

            //将运算符号传入工厂中进行实例化
            oper = OperationFactory.creatOpeation(operation.charAt(0));
            oper.numberA=Double.parseDouble(numberA);
            oper.numberB=Double.parseDouble(numberB);//变成为double形式
            resultNum=oper.getResult();
            wb3.setText(String.valueOf(resultNum));//把double类型变成字符串

        }
    }

}

5.效果图:

6.总结:

计算机之简单工厂模式机构图:

计算器工厂模式架构图.png

1.简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

2.角色:工厂类  具体类   抽象类

 

好了,先到这里吧!!!!8888888888888888  希望大家多多指教,多多沟通!

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阳光不锈@

如果有帮助的话,打赏一下吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值