package com.jiangwg.psj.design;
import java.util.Scanner;
/**
* @Auther: Peng Senjie
* @Date: 2018-09-14
* @Description: 简单工厂模式
*/
public class Jiandangongchang {
public static void main(String[] args) {
//one();//一般
//two();//进阶:封装。业务界面分开,复用性,
//three();//继承多态,松耦合,增加一个分支,如开根号算法,为了不影响原来方法,
four();//简单工厂模式,加减算法用一个类去代理
}
private static void one(){
Scanner sc = new Scanner(System.in);
System.out.println("请输入数字A:");
String numberA = sc.nextLine(); //读取字符串型输入
System.out.println("请输入运算符:");
String strOperate = sc.nextLine(); //读取字符串型输入
System.out.println("请输入数字B:");
String numberB = sc.nextLine(); //读取字符串型输入
double result=0.0;
double v = Double.parseDouble(numberA);
double v1 = Double.parseDouble(numberB);
switch (strOperate){
case "+":
result=v+v1;
break;
case "-":
result=v+v1;
break;
case "*":
result=v+v1;
break;
case "/":
if(numberB.equals("0")){
System.out.println("被除数不能为0");
}else {
result=v+v1;
}
break;
}
System.out.println("结果是:" + result);
}
private static void two(){
Scanner sc = new Scanner(System.in);
System.out.println("请输入数字A:");
String numberA = sc.nextLine(); //读取字符串型输入
System.out.println("请输入运算符:");
String strOperate = sc.nextLine(); //读取字符串型输入
System.out.println("请输入数字B:");
String numberB = sc.nextLine(); //读取字符串型输入
double result = Operation.getResult(numberA,numberB,strOperate);
System.out.println("结果是:" + result);
}
private static void three(){
Scanner sc = new Scanner(System.in);
System.out.println("请输入数字A:");
String numberA = sc.nextLine(); //读取字符串型输入
//System.out.println("请输入运算符:");
//String strOperate = sc.nextLine(); //读取字符串型输入
System.out.println("请输入数字B:");
String numberB = sc.nextLine(); //读取字符串型输入
OperationDiv operationMul = new OperationDiv();
//todo:每次都要实列化对象(符号也没了。),能不能根据符号自动实列话出相应的对象呢(用单独类去代理实例化的过程)---》简单工厂
operationMul.setNewA(Double.parseDouble(numberA));
operationMul.setNewB(Double.parseDouble(numberB));
double result = operationMul.getResult();
System.out.println("结果是:" + result);
}
private static void four(){
Scanner sc = new Scanner(System.in);
System.out.println("请输入数字A:");
String numberA = sc.nextLine(); //读取字符串型输入
System.out.println("请输入运算符:");
String strOperate = sc.nextLine(); //读取字符串型输入
System.out.println("请输入数字B:");
String numberB = sc.nextLine(); //读取字符串型输入
OperationTwo op = OperationFactory.createOp(strOperate);
op.setNewA(Double.parseDouble(numberA));
op.setNewB(Double.parseDouble(numberB));
double result = op.getResult();
System.out.println("结果是:" + result);
}
}
class Operation {
static double getResult(String numberA,String numberB,String strOperate){
double result=0.0;
double v = Double.parseDouble(numberA);
double v1 = Double.parseDouble(numberB);
switch (strOperate){
case "+":
result=v+v1;
break;
case "-":
result=v+v1;
break;
case "*":
result=v+v1;
break;
case "/":
if(numberB.equals("0")){
System.out.println("被除数不能为0");
}else {
result=v+v1;
}
break;
}
return result;
}
}
class OperationTwo{
private double newA=0.0;
private double newB=0.0;
public double getNewA() {
return newA;
}
public void setNewA(double newA) {
this.newA = newA;
}
public double getNewB() {
return newB;
}
public void setNewB(double newB) {
this.newB = newB;
}
public double getResult(){
double result=0.0;
return result;
}
}
class OperationAdd extends OperationTwo{
@Override
public double getResult() {
double result=0.0;
result=getNewA()+getNewB();
return result;
}
}
class OperationSub extends OperationTwo{
@Override
public double getResult() {
double result=0.0;
result=getNewA()-getNewB();
return result;
}
}
class OperationMul extends OperationTwo{
@Override
public double getResult() {
double result=0.0;
result=getNewA()*getNewB();
return result;
}
}
class OperationDiv extends OperationTwo{
@Override
public double getResult() {
double result=0.0;
System.out.println("getnewb:"+getNewB());
if(Double.doubleToLongBits(getNewB())==0){
System.out.println("被除数不能为0");
}else{
result=getNewA()/getNewB();
}
return result;
}
}
class OperationFactory{
public static OperationTwo createOp(String strOperate){
double result=0.0;
OperationTwo otwo=null;
switch (strOperate){
case "+":
otwo=new OperationAdd();
break;
case "-":
otwo=new OperationSub();
break;
case "*":
otwo=new OperationMul();
break;
case "/":
otwo=new OperationDiv();
break;
}
return otwo;
}
}