1 package designpattern.staticfactorymethod; 2 import java.util.scanner; 3 public class calculator { 4 public static void main(string[] args) { 5 scanner scanner = new scanner(system.in); 6 system.out.println("请输入一个数字"); 7 double num1 = scanner.nextdouble(); 8 system.out.println("请输入一个运算符:+、-、*、/"); 9 string operator = scanner.next();// 不能用nextline(),会把上一个回车给吸收 10 system.out.println("请输入一个数字"); 11 double num2 = scanner.nextdouble(); 12 switch (operator) { 13 case "+": 14 system.out.println(num1 + num2); 15 break; 16 case "-": 17 system.out.println(num1 - num2); 18 break; 19 case "*": 20 system.out.println(num1 * num2); 21 break; 22 case "/": 23 system.out.println(num1 / num2); 24 break; 25 default: 26 break; 27 } 28 scanner.close(); 29 } 30 }
最多把计算的方法单拉出来:
package designpattern.staticfactorymethod; import java.util.scanner; public class calculator2 { public static void main(string[] args) { scanner scanner = new scanner(system.in); system.out.println("请输入一个数字"); double num1 = scanner.nextdouble(); system.out.println("请输入一个运算符:+、-、*、/"); string operator = scanner.next();// 不能用nextline(),会把上一个回车给吸收 system.out.println("请输入一个数字"); double num2 = scanner.nextdouble(); switch (operator) { case "+": system.out.println(plus(num1, num2)); break; case "-": system.out.println(minus(num1, num2)); break; case "*": system.out.println(multiply(num1, num2)); break; case "/": system.out.println(divide(num1, num2)); break; default: break; } scanner.close(); } static double plus(double num1, double num2) { return num1 + num2; } static double minus(double num1, double num2) { return num1 - num2; } static double multiply(double num1, double num2) { return num1 * num2; } static double divide(double num1, double num2) { return num1 / num2; } }
package designpattern.staticfactorymethod; public class calculatorutil { static double plus(double num1, double num2) { return num1 + num2; } static double minus(double num1, double num2) { return num1 - num2; } static double multiply(double num1, double num2) { return num1 * num2; } static double divide(double num1, double num2) { return num1 / num2; } }
package designpattern.staticfactorymethod; import java.util.scanner; public class calculator3 { public static void main(string[] args) { scanner scanner = new scanner(system.in); system.out.println("请输入一个数字"); double num1 = scanner.nextdouble(); system.out.println("请输入一个运算符:+、-、*、/"); string operator = scanner.next();// 不能用nextline(),会把上一个回车给吸收 system.out.println("请输入一个数字"); double num2 = scanner.nextdouble(); calculator3 calculator3 = new calculator3(); switch (operator) { case "+": system.out.println(calculator3.new plus(num1, num2).calculate()); break; case "-": system.out.println(calculator3.new minus(num1, num2).calculate()); break; case "*": system.out.println(calculator3.new multiply(num1, num2).calculate()); break; case "/": system.out.println(calculator3.new divide(num1, num2).calculate()); break; default: break; } scanner.close(); } class plus { double num1; double num2; plus(double num1, double num2) { this.num1 = num1; this.num2 = num2; } double calculate() { return num1 + num2; } } class minus { double num1; double num2; minus(double num1, double num2) { this.num1 = num1; this.num2 = num2; } double calculate() { return num1 - num2; } } class multiply { double num1; double num2; multiply(double num1, double num2) { this.num1 = num1; this.num2 = num2; } double calculate() { return num1 * num2; } } class divide { double num1; double num2; divide(double num1, double num2) { this.num1 = num1; this.num2 = num2; } double calculate() { return num1 / num2; } } }
package designpattern.staticfactorymethod; public abstract class calculate { double num1; double num2; calculate() { } calculate(double num1, double num2) { this.num1 = num1; this.num2 = num2; } public abstract double calculate(); }
具体运算子类们:
package designpattern.staticfactorymethod; public class plus extends calculate { plus() { } plus(double num1, double num2) { super(num1, num2); } @override public double calculate() { return num1 + num2; } }
package designpattern.staticfactorymethod; public class minus extends calculate { minus() { } minus(double num1, double num2) { super(num1, num2); } @override public double calculate() { return num1 - num2; } }
package designpattern.staticfactorymethod; public class multiply extends calculate { multiply() { } multiply(double num1, double num2) { super(num1, num2); } @override public double calculate() { return num1 * num2; } }
package designpattern.staticfactorymethod; public class divide extends calculate { divide() { } divide(double num1, double num2) { super(num1, num2); } @override public double calculate() { return num1 / num2; } }
当然实际代码中,不能像上面这样天马行空,术业还是要有专攻的,比如一个工厂专门生产各种各样的女朋友,额。。
比如iphon的工厂专门生产各种型号的ipone。
把这个思想用到我们的程序中,我们需要一个工厂,接受一个参数,然后它就能返回相应的对象:
package designpattern.staticfactorymethod; public class calculatefactory { public static calculate create(string operate) { switch (operate) { case "+": return new plus(); case "-": return new minus(); case "*": return new multiply(); case "/": return new divide(); } return null; } }
package designpattern.staticfactorymethod; import java.util.scanner; public class calculator4 { public static void main(string[] args) { scanner scanner = new scanner(system.in); system.out.println("请输入一个数字"); double num1 = scanner.nextdouble(); system.out.println("请输入一个运算符:+、-、*、/"); string operator = scanner.next();// 不能用nextline(),会把上一个回车给吸收 system.out.println("请输入一个数字"); double num2 = scanner.nextdouble(); calculate calculate = calculatefactory.create(operator); calculate.num1 = num1; calculate.num2 = num2; system.out.println(calculate.calculate()); scanner.close(); } }
这回多态也出场了,通过多态,统一用父类接受创建的具体子类,当需要增加运算方式时,只需要修改工厂类和具体的运算类,调用的地方不用变,降低了模块间的耦合性,提高了系统的灵活性。
如对本文有疑问, 点击进行留言回复!!
【面试题】研究过tomcat的NioEndpoint源码吗?请阐述下Reactor多线程模型在tomcat中的实现。
荐 厉害了!阿里P8架构师用4大技术文档带你深入解读爆火的中台战略
网友评论