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 希望大家多多指教,多多沟通!