基于简单工厂模式的计算器程序
这个计算器是我学Java时写的第一个Swing程序,后来我读《大话设计模式》的第一章简单工厂模式恰好也是计算器,于是就改进了之前这个。
源代码下载:https://github.com/myCodingTrip/Calculator
运算类Operation.java
public abstract class Operation {protected double numberA = 0;protected double numberB = 0;protected double result = 0;public double getNumberA() {return numberA;}public void setNumberA(double numberA) {this.numberA = numberA;}public double getNumberB() {return numberB;}public void setNumberB(double numberB) {this.numberB = numberB;}public abstract double getResult(); }class OperationAdd extends Operation{@Overridepublic double getResult() {double result = 0;result = numberA + numberB;return result;} } class OperationSub extends Operation{@Overridepublic double getResult() {result = numberA - numberB;return result;} } class OperationMul extends Operation{@Overridepublic double getResult() {result = numberA * numberB;return result;} } class OperationDiv extends Operation{@Overridepublic double getResult(){try {result = numberA / numberB;} catch (Exception e) {System.out.println("除数不能为0");e.printStackTrace();}return result;} }
工厂类 OperationFactory.java
//简单工厂模式 //只需要传入运算符号,工厂就实例化出合适的对象,用过多态,返回父类的方式实现计算器的结果 public class OperationFactory {public static Operation createOperate(char sign) {Operation operation = null;switch (sign) {case '+':operation = new OperationAdd();break;case '-':operation = new OperationSub();break;case '*':operation = new OperationMul();break;case '/':operation = new OperationDiv();break;default:break;}return operation;} }
计算器界面CalculateFrame.java
import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent;import javax.swing.ButtonGroup; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JTextField;@SuppressWarnings("serial") public class CalculateFrame extends JFrame{private JTextField textData1, textData2, textResult;private JLabel labelNum1, labelNum2, labelResult;private JRadioButton radioAdd, radioSub, radioMul, radioDiv;private JButton btnCalculate;private Operation oper;//进行运算的两个数字和结果private String data1, data2, operation;private double resultNum;public CalculateFrame(){ //设置窗口基本属性this.setTitle("简单计算器");this.setSize(300, 200);//本机分辨率为1366*768this.setLocation(1366/2-300/2, 768/2-200/2);//this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.addWindowListener(new WindowAdapter(){@Overridepublic void windowClosing(WindowEvent e) {setVisible (false);System.exit(0);}});initView();initLayout();this.setVisible(true);//显示窗口btnCalculate.addActionListener(new ButtonListener()); }//设置一些功能区域public void initView() {textData1 = new JTextField();textData2 = new JTextField();textResult = new JTextField();textResult.setEnabled(false);labelNum1 = new JLabel("第一个数:");labelNum2 = new JLabel("第二个数:");labelResult = new JLabel("结果:");btnCalculate = new JButton("计算");radioAdd = new JRadioButton("+");radioSub = new JRadioButton("-");radioMul = new JRadioButton("*");radioDiv = new JRadioButton("/");}//将控件加入到布局中public void initLayout() {JPanel p1 = new JPanel(new GridLayout(1,2));p1.add(labelNum1);p1.add(textData1);JPanel p2 = new JPanel(new GridLayout(1,4));p2.add(radioAdd);p2.add(radioSub);p2.add(radioMul);p2.add(radioDiv); JPanel p3 = new JPanel(new GridLayout(1,2));p3.add(labelNum2);p3.add(textData2);JPanel p4 = new JPanel(new GridLayout(1,2));p4.add(labelResult);p4.add(textResult);JPanel p5 = new JPanel(new GridLayout(1,1));p5.add(btnCalculate); this.setLayout(new GridLayout(5,1)); this.add(p1);this.add(p2);this.add(p3);this.add(p4);this.add(p5); ButtonGroup group = new ButtonGroup();group.add(radioAdd);group.add(radioSub);group.add(radioMul);group.add(radioDiv);}class ButtonListener implements ActionListener{//从程序中读入数据public void actionPerformed(ActionEvent e) {data1 = textData1.getText();data2 = textData2.getText();operation = "";if(radioAdd.isSelected()) operation = radioAdd.getText();else if(radioSub.isSelected()) operation = radioSub.getText(); else if(radioMul.isSelected()) operation = radioMul.getText(); else if(radioDiv.isSelected()) operation = radioDiv.getText();//将运算符号传入工厂中进行实例化oper = OperationFactory.createOperate(operation.charAt(0));oper.numberA = Double.parseDouble(data1);oper.numberB = Double.parseDouble(data2);resultNum = oper.getResult();textResult.setText(String.valueOf(resultNum));}} }
主程序 Main.java
public class Main {public static void main(String[] args) {new CalculateFrame();} }
程序界面:
转载于:https://www.cnblogs.com/mycd/p/5716328.html
基于简单工厂模式的计算器程序相关推荐
- 简单工厂模式_计算器实现
优点: 1.不用自己再去new对象,工厂会根据给的标识,自动替你new出一个你想要的实现类对象. 2.一定程度上在加减乘除之间实现了解耦合.提高了代码的复用性和扩展性. 缺点:违反了开闭性,即新增功能 ...
- java 工厂模式 计算器_简单工厂模式实现简易计算器
packageFactoryMethodPattern;/*创建人:czc 创建时间:2019/12/16 创建用途:简单工厂模式实现计算器--主界面*/ import javax.swing.*;i ...
- 解读设计模式----简单工厂模式(SimpleFactory Pattern),你要什么我就给你什么
本文首发于博客园,地址:http://www.cnblogs.com/beniao/archive/2008/08/09/1263318.html 一.模式概述 从设计模式的类型上来说,简单工厂模式是 ...
- Java设计模式之简单工厂模式实验(软件工程综合实践课程第二周)
实验目的 1 .理解软件设计的相关理论 : 2 .理解面向对象设计原则: 实验内容 1 .简单工厂模式实验: (1) 参考讲义上的代码,利用简单工厂模式完成计算器应用程序: (2) 画出计算器程序简单 ...
- python的编程模式-使用简单工厂模式来进行Python的设计模式编程
计模式的目的是让代码易维护.易扩展,不能为了模式而模式,因此一个简单的工具脚本是不需要用到任何模式的. 简单工厂模式又叫静态工厂方法模式,工厂模式家族中最简单的一种模式.这个模式的基本工作方式: 通过 ...
- java工厂模式 uml_深入浅出设计模式-简单工厂模式
模式定义 简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式定义了一个创建对象的类,由这个类来封装实例化 ...
- [Python设计模式] 第1章 计算器——简单工厂模式
github地址:https://github.com/cheesezh/python_design_patterns 写在前面的话 """ 读书的时候上过<设计模 ...
- 【设计模式-手写源码-附1】-简单工厂模式-基于魔兽争霸冰封王座
1:主题拆解 ①依赖倒置原则-SimpleFactory ②简单工厂+ 配置文件=可配置 ③简单工厂+ 配置文件+反射=可配置可扩展 ④简单工厂升级IOC控制反转 2:基本介绍 ①学习设计模式的套路: ...
- 编写Java程序,用户在网上购买商品(good),当用户买了一本书(book)、一顶帽子(hat)或者买了一双鞋子(shoe),卖家就会通过物流将商品邮寄给用户,使用简单工厂模式模拟这一过程。
查看本章节 查看作业目录 需求说明: 编写Java程序,用户在网上购买商品(good),当用户买了一本书(book).一顶帽子(hat)或者买了一双鞋子(shoe),卖家就会通过物流将商品邮寄给用户, ...
最新文章
- odoo10 工作流、安全机制、向导
- oracle数据字典表与视图
- 对B样条的理解和整理
- 我想做一个课程表系统利用PHP+MYSQL+HTML实现课表的展示,但是不知道如何实现
- php array_search多条件,php使用array_search与array_column函数实现二维数组内元素查找...
- WPF里面制作圆角文本框
- No HttpMessageConverter for com.ysd.entity.Users
- 如何使用Git Pull覆盖本地文件
- AutoIT:界面与自动化操作结合来简化日常劳动: .Net Reactor验证License,设置License,创建License,截图AutoIt自动化实现。(七)...
- 程序员的那些搞笑牛逼注释
- 关于被3个搞物理的“颠覆”了且数学天才陶哲轩“开始压根不相信”的数学常识的算法实现与理解
- 今日科技联播:美股暴跌引全球股市崩盘;腾讯跌出全球市值前十
- vue element 单张图片上传,删除,预览
- 幻灯片无缝滑动(无需重新设置下标)
- python class tynu()_Task02-BaseLine.ipynb
- [书目20141024]王正良硬笔书法教学
- mysql无法启动(centos7):systemctl status mysqld.service:Can‘t create/write to file
- 最新!互联网大厂各职级薪资对应关系图(2020年初)
- 联想x1carbon更换电池_联想_ThinkPad|ThinkCentre|ThinkStation服务与驱动下载_常见问题...
- opensuse安装pps for linux
热门文章
- [YTU]_2907(类重载实现矩阵加法)
- android grideview 图片png透明,Android完美解决GridView异步加载图片和加载大量图片时出现Out Of Memory问题...
- [笔记]filter,空字符,0,None都是False应用
- Java复习(四)类的重用
- SecureCR 改变背景色和文字颜色
- 【Git+Docker】Docker初期学习认识和安装配置详解
- eclipse ide for java ee developers与eclipse ide for java developers有什么区别
- 关于幸福的开发(搞笑版)
- Karush-Kuhn-Tucker 最优化条件 (KKT 条件)(转载)
- Linux dmesg 命令学习