大话设计模式之简单工厂模式笔记
简单工厂模式
以实现加、减、乘、除的计算器功能为例
初级代码:
输入数字交互界面
@SuppressWarnings("resource")
public static void main(String[] args) {
System.out.println("**********************************************");
System.out.println("《大话设计模式》代码样例");
System.out.println();
try {
Scanner sc = new Scanner(System.in);
System.out.println("请输入数字A:");
double numberA = Double.parseDouble(sc.nextLine());
System.out.println("请选择运算符号(+、-、*、/):");
String strOperate = sc.nextLine();
System.out.println("请输入数字B:");
double numberB = Double.parseDouble(sc.nextLine());
double result = getResult(numberA, numberB, strOperate);
System.out.println("结果是:" + result);
} catch (Exception e) {
System.out.println("您的输入有错:" + e.toString());
}
System.out.println();
System.out.println("**********************************************");
}
运算方法:
public static double getResult(double numberA, double numberB, String operate) {
double result = 0d;
switch (operate) {
case "+":
result = numberA + numberB;
break;
case "-":
result = numberA - numberB;
break;
case "*":
result = numberA * numberB;
break;
case "/":
result = numberA / numberB;
break;
case "pow":
result = java.lang.Math.pow(numberA, numberB);
break;
}
return result;
}
缺陷:无法做到灵活的可修改和扩展
比如说加个其他运算,导致需要重新修改运算方法 且需要把加减乘除的代码重新编译一遍;且如果不小心改了其他方法,程序会出现问题,给程序带来了风险;
好的代码应该是,修改其中一个不影响另外的几个,增加运算算法也不影响其它代码;
高级写法:
思路:
到底要实例化谁,将来会不会增加实例化的对象,也就是说会不会增加运算符,这是很容易变化的地方,应该考虑用一个单独的类来做这个创造实例的过程,这就是工厂
输入数字交互界面:
public static void main(String[] args){
System.out.println("**********************************************");
System.out.println("《大话设计模式》代码样例");
System.out.println();
try {
Scanner sc = new Scanner(System.in);
System.out.println("请输入数字A:");
double numberA = Double.parseDouble(sc.nextLine());
System.out.println("请选择运算符号(+、-、*、/):");
String strOperate = sc.nextLine();
System.out.println("请输入数字B:");
double numberB = Double.parseDouble(sc.nextLine());
Operation oper = OperationFactory.createOperate(strOperate);
double result = oper.getResult(numberA,numberB);
System.out.println("结果是:"+result);
}
catch(Exception e){
System.out.println("您的输入有错:"+e.toString());
}
System.out.println();
System.out.println("**********************************************");
}
工厂类
public class OperationFactory {
public static Operation createOperate(String operate){
Operation oper = null;
switch (operate) {
case "+":
oper = new Add();
break;
case "-":
oper = new Sub();
break;
case "*":
oper = new Mul();
break;
case "/":
oper = new Div();
break;
}
return oper;
}
}
抽象化运算类
public abstract class Operation {
public double getResult(double numberA, double numberB){
return 0d;
}
}
加
public class Add extends Operation {
public double getResult(double numberA, double numberB){
return numberA + numberB;
}
}
博客园地址:https://www.cnblogs.com/lixiuming521125/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人