简单工厂模式
来源:互联网 发布:一键装修淘宝店铺软件 编辑:程序博客网 时间:2024/05/16 12:40
由工厂对象决定创建出具体的产品类。业务类只需关注相应的业务方法。工厂类通过业务类传来的参数动态决定应该创建哪个产品类的实例。
具体角色:
工厂(Creator)角色:简单工厂模式的核心。它负责实现创建所有具体产品类的。工厂类的创建方法可以被外界直接调用以创建具体的产品类实例。
抽象产品(Product)角色:简单工厂模式创建的所有产品类的父类,负责描述所有实例所共有的公共接口。
具体产品(Concrete Product)角色:简单工厂模式创建的目标。所有创建的对象都是莫个具体产品类的实例。
UML模型图
例:
需求:
现在需要设计一个计算器,输入限两个数字。可以实现加减乘除,后期可随时增加运算方法。
实现思路:
客户端进行输入并进行选择相应的运算方法,可定义一个计算机类,在创建的时候向其输入相应的运算符号,返回具体的运算方法实现类,调用其公共方法进行运算。
1:定义一个运算类,里面写好要进行运算的方法。
如何通过运算符来进行运算呢?
2.1:可以在运算类的运算方法通过if,else进行判断选择,不过耦合度太高。
后期若要增加新的运算,需要对原有类进行修改,不安全且修改起来也不方便。
2.2:可以为每一个运算方法写一个具体的实现类并继承运算类重写运算方法,可以动态增加新的运算方法,只需要新增运算方法的具体实现类就好了。如果想要哪种方法,直接在业务类new出相应的方法对象。但是业务类每写一种新的运算方法都要new 一个不同的实现类,后期维护不方便。
2.3:可以为每一个运算方法写一个具体的实现类并继承运算类重写运算方法,可以动态增加新的运算方法,只需要新增运算方法的具体实现类就好了。然后在创建一个工厂类,专门负责创建具体实现类的实例。工厂类如何创建具体实现类的实例呢,业务类可以在调用工厂类时传输进一个参数,由工厂进行选择具体实例化哪个对象。
代码实现
抽象产品(Product)角色
package cn.operation;/** * 抽象产品角色,定义运算的公共方法 */public abstract class Operation { public static final long timebegin=System.currentTimeMillis(); public double numberA =0; public double numberB=0; public abstract double getResult() throws Exception;}
工厂(Creator)角色
package cn.operation;/** * 运算工厂类 */public class OperationFactory { public static Operation createOperation(String operate){ Operation oper=null; if ("+".equals(operate)) { oper=new OperationAdd(); }else if ("-".equals(operate)) { oper=new OperationSub(); }else if ("*".equals(operate)) { oper=new OperationMul(); }else if ("/".equals(operate)) { oper=new OperationDiv(); } return oper; }}
具体产品(Concrete Product)角色
加法运算实现类:
package cn.operation; /** * 加法实现类 */public class OperationAdd extends Operation { @Override public double getResult() { // TODO Auto-generated method stub return numberA+numberB; }
减法运算实现类:
package cn.operation;/** *减法实现类 */public class OperationSub extends Operation { @Override public double getResult() throws Exception { // TODO Auto-generated method stub if (numberB==0) { throw new Exception("除数不能为0"); } return numberA/numberB; } }
除法运算实现类
package cn.operation;/** *减法实现类 */public class OperationDiv extends Operation { @Override public double getResult() throws Exception { // TODO Auto-generated method stub if (numberB==0) { throw new Exception("除数不能为0"); } return numberA/numberB; }}
乘法运算实现类
package cn.operation;/** * 乘法实现类 */public class OperationMul extends Operation { @Override public double getResult() { // TODO Auto-generated method stub return numberA*numberB; } }
调用工厂业务类
package cn.operation;/** *调用工厂业务类 */public class OperationClient { public static void main(String[] args) throws Exception { Operation oper= OperationFactory.createOperation("*"); oper.numberA=12; oper.numberB=20; System.out.println(oper.getResult()); }}
- 工厂模式-简单工厂
- 工厂模式-简单工厂
- 工厂模式-简单工厂模式
- 工厂模式-简单工厂模式
- 简单工厂模式,工厂模式
- 工厂模式-简单工厂模式
- 简单工厂模式,工厂模式
- 简单工厂、工厂模式、抽象工厂模式
- 简单工厂、工厂模式、抽象工厂模式
- 简单工厂&工厂模式&抽象工厂模式
- 简单工厂和工厂模式
- 简单工厂和工厂模式
- 1,工厂模式--简单工厂
- 简单工厂和工厂模式
- 简单工厂,工厂模式,抽象工厂
- 简单工厂,工厂模式,抽象工厂
- 简单工厂、工厂方法、抽象工厂模式
- 简单工厂、工厂模式和抽象工厂
- 拉勾网的语言与技术方向爬虫
- TensorFlow:简单的卷积层、池化层(采样层)示例
- 初学javaWeb遇到的问题,来个小总结
- 词向量源码解析:(4.8)hyperwords源码解析之example_test
- faster-rcnn之RPN网络的结构解析
- 简单工厂模式
- windows+apache2.4+mysql+php5.6
- Java jsp:转发与重定向的区别;Cookie与session的比较
- 电信宽带运营采集系统项目总结
- Racer: 自动补齐神器
- swift 3.0 打印宏设置
- 组合计数问题
- AJAX-实现页面内跳转实例
- tablayout结合着viewPager来使用