import java.util.Scanner;

 public class CaculationTest {

     public static void main(String[] args) {

         Scanner reader = new Scanner(System.in);
double a, b, result = 0;
String operator;
Operation operation = null; System.out.println("************************");
System.out.println("* 学号:1308060310 *");
System.out.println("* 班级:网络131班 *");
System.out.println("* 姓名:王朝远 *");
System.out.println("************************"); TwoFromConsole twoFromConsole = new TwoFromConsole();
a = twoFromConsole.getFirstDoubleFromConsole(); // 获取第一个数
b = twoFromConsole.getTwoDoubleFromConsole(); // 获取第二个数 OperatorFromConsole operatorFromConsole = new OperatorFromConsole();
operator = operatorFromConsole.getOperator(); // 获取运算符号
do {
if (operator.equals("/") && b == 0) {
System.out.print("除法运算分母不能为0,请重新输入,");
b = twoFromConsole.getTwoDoubleFromConsole(); // 获取第二个数
continue;
}
break;
} while (true); // 获取要运算的对象
operation = Factory.getInstance(operator);
result = operation.getResult(a, b); // 判断用户是否继续对数运算,如果是继续对数运算,结果的输出方式就不一样,并且让用户选择是否再次计算
if (operator.equals("log")) { System.out.println("log" + "(" + b + ")" + a + "=" + result);
} else {
System.out.println(a + operator + b + "=" + result);
}
}
} class TwoFromConsole { Scanner reader = new Scanner(System.in); // 获取数字的方法的具体实现
public double getFirstDoubleFromConsole() { double x = 0;
System.out.print("请输入第一个数字:");
do {
double temp = 0;
try {
temp = reader.nextDouble();
} catch (Exception e) {
System.out.print("请重新输入第一个数字:");
continue;
}
x = temp;
break;
} while (true);
return x;
} public double getTwoDoubleFromConsole() { double x = 0;
System.out.print("请输入第二个数字:");
do {
double temp = 0;
try {
temp = reader.nextDouble();
} catch (Exception e) {
System.out.print("请重新输入第二个数字:");
continue;
}
x = temp;
break;
} while (true);
return x;
}
} /**
* 获取运算符类
*/
class OperatorFromConsole { Scanner reader = new Scanner(System.in); /**
* @return 合理的运算符
*/
public String getOperator() {
System.out.print("请输入运算符:"); String operator;
boolean b;
do {
operator = reader.nextLine();
b = !(operator.equals("+") || operator.equals("-") || operator.equals("*") || operator.equals("/")
|| operator.equals("log"));
if (b == true) {
System.out.print("请重新输入运算符:");
}
} while (b); return operator;
}
} /**
* 功能:各个运算的父接口,子类必须实现父接口里面的方法
*/
interface Operation { double getResult(double x, double y);
} /**
* 实现加法运算的类
*/
class Add implements Operation { /**
* 重写接口里面的方法,并实现加法功能
*/
@Override
public double getResult(double x, double y) {
// TODO Auto-generated method stub
return x + y;
} } /**
* 实现减法运算的类
*/
class Sub implements Operation { /**
* 重写接口里面的方法,并实现减法功能
*/
@Override
public double getResult(double x, double y) {
// TODO Auto-generated method stub
return x - y;
}
} /**
* 实现乘法运算的类
*/
class Mul implements Operation { /**
* 重写接口里面的方法,并实现乘法功能
*/
@Override
public double getResult(double x, double y) {
// TODO Auto-generated method stub
return x * y;
} } /**
* 实现除法运算的类
*/
class Div implements Operation { /**
* 重写接口里面的方法,并实现除法功能
*/
@Override
public double getResult(double x, double y) {
// TODO Auto-generated method stub
return x / y;
} } /**
* 实现对数运算的类
*/
class Logarithm implements Operation { /**
* 重写接口里面的方法,并实现对数运算功能
*/
@Override
public double getResult(double x, double y) {
// TODO Auto-generated method stub
return Math.log(x) / Math.log(y); // x表示对数,y表示底数
} } /**
* 生成用户所需要的对象工厂类
*/
class Factory { /**
* @param operator
* 用户选择的运算
* @return 用户所需要的对象
*/
public static Operation getInstance(String operator) {
Operation operation = null;
switch (operator) {
case "+":
operation = new Add(); // 实例化加法对象
break;
case "-":
operation = new Sub(); // 实例化减法对象
break;
case "*":
operation = new Mul(); // 实例化乘法对象
break;
case "/":
operation = new Div(); // 实例化除法对象
break;
case "log":
operation = new Logarithm(); // 实例化对数运算对象
break;
} return operation;
}
}

java 计算器基于工厂模式和功能单一模式的更多相关文章

  1. java之设计模式工厂三兄弟之抽象工厂模式

    [学习难度:★★★★☆,使用频率:★★★★★]  工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问题,但由于工厂方法模式中的每个工厂只生产一类产品,可能会导致系统中存在大量的工 ...

  2. java之设计模式工厂三兄弟之简单工厂模式

    [学习难度:★★☆☆☆,使用频率:★★★☆☆] 工厂模式是最常用的一类创建型设计模式,通常我们所说的工厂模式是指工厂方法模式,它也是使用频率最高的工厂模式.本章将要学习的简单工厂模式是工厂方法模式的& ...

  3. Java 设计模式之工厂模式(二)

    原文地址:Java 设计模式之工厂模式(二) 博客地址:http://www.extlight.com 一.背景 本篇内容是 Java 设计模式创建型模式的第二篇.上一篇主题为 <Java 设计 ...

  4. JAVA设计模式之工厂方法模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述工厂方法模式的: 工厂方法模式是类的创建模式,又叫做虚拟构造子(Virtual Constructor)模式或者多态性工厂(Polymor ...

  5. java三种工厂模式

    适用场合: 7.3 工厂模式的适用场合 创建新对象最简单的办法是使用new关键字和具体类.只有在某些场合下,创建和维护对象工厂所带来的额外复杂性才是物有所值.本节概括了这些场合. 7.3.1 动态实现 ...

  6. java 三种工厂模式

    一.简单工厂模式 一个栗子: 我喜欢吃面条,抽象一个面条基类,(接口也可以),这是产品的抽象类. public abstract class INoodles { /** * 描述每种面条啥样的 */ ...

  7. java之设计模式工厂三兄弟之工厂方法模式

    [学习难度:★★☆☆☆,使用频率:★★★★★] 简单工厂模式虽然简单,但存在一个很严重的问题.当系统中需要引入新产品时,由于静态工厂方法通过所传入参数的不同来创建不同的产品,这必定要修改工厂类的源代码 ...

  8. 女娲造人引发思考之Java设计模式:工厂模式

    目录 工厂模式的几种形态 简单工厂模式 示例 结构 优缺点 女娲抟土造人 工厂方法模式 结构 女娲举绳造人 抽象工厂模式 结构 女娲造万物 工厂模式的几种形态 工厂模式专门负责将大量有共同接口的类实例 ...

  9. java设计模式,工厂,代理模式等

    javaEE设计模式: 工厂模式:主要分为三种模式: 定义:在基类中定义创建对象的一个接口,让子类决定实例化哪个类.工厂方法让一个类的实例化延迟到子类中进行. 为什么要使用工厂模式: (1) 解耦 : ...

随机推荐

  1. 一张图告诉你为什么 Gmail 是最好的邮箱,以及大量私货

    今天早上,我的同事详细介绍了 Gmail 相比其他邮箱的优势,比如强大的垃圾邮件过滤.简单的使用界面.强大的功能设置等等.但是对我来说,这些并不是我使用 Gmail 的最重要原因. 我第一个正式的邮箱 ...

  2. 网络数据的XML解析

    网络应用中的数据解析,因为最近的应用,无论是Android的和ios平台的,一直用也是建议用的都是Json解析, xml解析都有点被遗忘了. 然后最近自己在做着玩一个ios的小应用,涉及网络数据的抓取 ...

  3. dllimport路径问题

    今天做了个试验,是针对dllimport("XXX.DLL");这样写的时候,系统是如何寻找该dll的. 首先系统会搜寻主应用程序根目录. 其次搜寻操作系统安装目录,一般情况是C: ...

  4. 通过AssetsLibrary框架访问所有相片

    该框架下有几个类,ALAssetsLibrary,ALAssetsGroup,ALAsset,ALAssetsFilter,ALAssetRepresentation. ALAssetsLibrary ...

  5. VBS_DO...Loop

    循环用于重复执行一组语句.循环可分为三类:一类在条件变为 False 之前重复执行语句,一类在条件变为 True 之前重复执行语句,另一类按照指定的次数重复执行语句. 在 VBScript 中可使用下 ...

  6. MongoDB索引、聚合

    用$where可以执行任意的js作为查询的一部分. db.foo.find({"$where" : function(){          for(var current in ...

  7. Milk

    Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submission(s) ...

  8. 【转】What is an entity system framework for game development?

    What is an entity system framework for game development? Posted on 19 January 2012 Last week I relea ...

  9. C,C++宏中#与##的讲解[转]

    MoreWindows 专注于Windows编程 C,C++宏中#与##的讲解 文中__FILE__与示例1可以参见<使用ANSI C and Microsoft C++中常用的预定义宏> ...

  10. github for windows 安装失败解决方案(亲测)

    早之前就有接触github,也在公司机子上装过,一路下来挺顺畅的.夏老师还纳闷他的机子装不上,我说,有鬼! 然而时隔一个月自己再来装,却在自己的本本上遇到鬼了. 然而网上论坛收了一堆,各种试.果断放弃 ...