陕西做网站的公司电话,如何制作一个简易网站,网站建设常用的英文,买域名做网站推广都是些什么1.业务需求
大家好#xff0c;我是菠菜。在介绍这期简单工厂设计模式前#xff0c;我们先来看看这样的需求#xff1a;制作一个简单的计算器#xff0c;能够实现控制台输入俩个数以及运算符完成运算。
2.初步实现
实现第一版思路#xff1a;
创建计算器类…1.业务需求
大家好我是菠菜。在介绍这期简单工厂设计模式前我们先来看看这样的需求制作一个简单的计算器能够实现控制台输入俩个数以及运算符完成运算。
2.初步实现
实现第一版思路
创建计算器类控制台输入俩个数以及运算符通过if条件输出运算结果。
CalClient 类
public class CalClient {public static void main(String[] args) {Scanner scnew Scanner(System.in);System.out.println(请输入第一个数);double numberasc.nextDouble();System.out.println(请输入运算符);String operatorsc.next();System.out.println(请输入第二个数);double numberbsc.nextDouble();if(.equals(operator)){System.out.println(运算结果为(numberanumberb));}else if(-.equals(operator)){System.out.println(运算结果为(numbera-numberb));}else if(*.equals(operator)){System.out.println(运算结果为(numbera*numberb));}else if(/.equals(operator)){if(numberb0){System.out.println(除数不能为零);return;}System.out.println(运算结果为(numbera/numberb));}}
} 思考这段代码在当时初学编程来说没有问题而且结果都能执行成功并输出。但是现在我们再来看是不是有点不太满意的地方比如计算控制台逻辑和计算方法逻辑耦合在一起不满足上一期我们所学的单一职责原则于是我又优化了一版。
实现第二版思路
增加Operation运算类将计算方法封装到里面把计算控制台逻辑和计算方法拆开降低耦合。
Operation类
public class Operation {public static Double getOperationResult(double numbera,double numberb,String operator){Double resultnull;switch (operator){case :resultnumberanumberb;break;case -:resultnumbera-numberb;break;case *:resultnumbera*numberb;break;case /:if(numberb0){System.out.println(除数不能为零);return result;}resultnumbera/numberb;break;}return result;}
}CalClient类
public class CalClient {public static void main(String[] args) {Scanner scnew Scanner(System.in);System.out.println(请输入第一个数);double numberasc.nextDouble();System.out.println(请输入运算符);String operatorsc.next();System.out.println(请输入第二个数);double numberbsc.nextDouble();//2.将业务逻辑和界面逻辑分开 解耦System.out.println(运算结果为(Operation.getOperationResult(numbera,numberb,operator)));}
} **思考**上述代码虽然将控制台和计算方法解耦而且这个计算方法类可以做到一定程度上的复用但是又有了一些新的问题后续添加或修改计算方法要修改整个Operation类并编译不安全而且会影响到正常运行的代码而且该设计没有面向对象编程。我思考了一下于是就有了下一个升级版本。
3.方案改进
实现第三版本思路
增加类OperationFactory用于实例化具体的计算实例。增加抽象类AOpeartion提取统一计算方法。增加计算实现类OperationAdd、OperationSub、OperationMul、OperationDiv。 OperationFactory类
public class OperationFactory {public static AOpeartion createOperation(String operator){AOpeartion opeartionnull;switch (operator){case :opeartionnew OperationAdd();break;case -:opeartionnew OperationSub();break;case *:opeartionnew OperationMul();break;case /:opeartionnew OperationDiv();break;}return opeartion;}
}AOpeartion类
public abstract class AOpeartion {public abstract Double getOperationResult(double numbera, double numberb);
}OperationAdd类
public class OperationAdd extends AOpeartion {Overridepublic Double getOperationResult(double numbera, double numberb) {return numberanumberb;}
}OperationSub类
public class OperationSub extends AOpeartion {Overridepublic Double getOperationResult(double numbera, double numberb) {return numbera-numberb;}
}OperationMul类
public class OperationMul extends AOpeartion {Overridepublic Double getOperationResult(double numbera, double numberb) {return numbera*numberb;}
}OperationDiv类
public class OperationDiv extends AOpeartion {Overridepublic Double getOperationResult(double numbera, double numberb) {if(numberb0){System.out.println(除数不能为零);return null;}return numbera/numberb;}
}CalClient类
public class CalClient {public static void main(String[] args) {Scanner scnew Scanner(System.in);System.out.println(请输入第一个数);double numberasc.nextDouble();System.out.println(请输入运算符);String operatorsc.next();System.out.println(请输入第二个数);double numberbsc.nextDouble();//3.利用简单工厂实现 易维护 易复用 易拓展AOpeartion opeartionOperationFactory.createOperation(operator);if(null!opeartion){System.out.println(运算结果为(opeartion.getOperationResult(numbera,numberb)));}else{System.out.println(运算工厂获取运算类失败);}}
} 思考OperationFactory工厂类通过输入的运算符去实例化相应合适的对象通过多态返回父类的方式实现了计算器的结果。后续如果修改具体的计算方法只要修改具体的计算类即可不会影响其它计算类。如果增加计算方法增加实现相应的计算类的具体子类以及增加计算工厂类的switch分支即可。
4.定义和组成结构
工厂模式的定义定义一个创建产品对象的工厂接口将产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中所要求的“创建与使用相分离”的特点。按实际业务场景划分工厂模式有 3 种不同的实现方式分别是简单工厂模式、工厂方法模式和抽象工厂模式。我们把被创建的对象称为“产品”把创建产品的对象称为“工厂”。如果要创建的产品不多只要一个工厂类就可以完成这种模式叫“简单工厂模式”。在简单工厂模式中创建实例的方法通常为静态static方法因此简单工厂模式Simple Factory Pattern又叫作静态工厂方法模式Static Factory Method Pattern。
简单工厂模式的主要角色如下
简单工厂SimpleFactory是简单工厂模式的核心负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用创建所需的产品对象。 抽象产品AbstractProduct是简单工厂创建的所有对象的父类负责描述所有实例共有的公共接口。 具体产品ConcreteProduct是简单工厂模式的具体创建目标。 5.优缺点以及应用场景
优点
简单工厂模式实现了对象创建和使用的分离职责分明客户端无需知道所创建具体对象的类名只需知道参数即可
缺点:
工厂类集中了所有产品的创建逻辑职责过重系统扩展困难添加新产品要修改原有逻辑,违反了开闭原则产品种类一多工厂类逻辑过于复杂不利有扩展和维护
应用场景 对于产品种类相对较少的情况考虑使用简单工厂模式。使用简单工厂模式的客户端只需要传入工厂类的参数不需要关心如何创建对象的逻辑可以很方便地创建所需产品。
友情提示请尊重作者劳动成果如需转载本博客文章请注明出处谢谢合作 【作者我爱吃菠菜 个人博客地址】