简单工厂模式:由一个叫做工厂类的东西决定生产什么样的实例,你只要传递一个信息给工厂类,工厂类就知道应该生产什么样的产品。
工厂:生产具体产品的东西
产品:继承了一个基类或者接口,这个接口或基类抽象出了公共的变量和方法,具体实现由产品去实现
优点:松耦合,添加功能方便
例:使用简单工厂模式实现一个计算器类
1、建立一个抽象基类
/** *Jun 27, 2013 *Copyright(c)JackWang *All rights reserve *@Author <a href="mailto:wangchengjack@163.com">JackWang</a> */ package com.example.simplefactory; public abstract class Operator { private Double numA; //第一个操作数 private Double numB; //第二个操作数 public Double getNumA() { return numA; } public void setNumA(Double numA) { this.numA = numA; } public Double getNumB() { return numB; } public void setNumB(Double numB) { this.numB = numB; } /** * 运算方法,由具体的类实现 * @return */ public abstract Double getResult(); }
2、四个具体实现类 实现 加 减 乘 除
/** *Jun 27, 2013 *Copyright(c)JackWang *All rights reserve *@Author <a href="mailto:wangchengjack@163.com">JackWang</a> */ package com.example.simplefactory; public class OperatorAdd extends Operator { @Override public Double getResult() { return this.getNumA() + this.getNumB(); } }
/** *Jun 27, 2013 *Copyright(c)JackWang *All rights reserve *@Author <a href="mailto:wangchengjack@163.com">JackWang</a> */ package com.example.simplefactory; public class OperatorSub extends Operator { @Override public Double getResult() { return this.getNumA() - this.getNumB(); } }
/** *Jun 27, 2013 *Copyright(c)JackWang *All rights reserve *@Author <a href="mailto:wangchengjack@163.com">JackWang</a> */ package com.example.simplefactory; public class OperatorMuti extends Operator{ @Override public Double getResult() { return this.getNumA() * this.getNumB(); } }
/** *Jun 27, 2013 *Copyright(c)JackWang *All rights reserve *@Author <a href="mailto:wangchengjack@163.com">JackWang</a> */ package com.example.simplefactory; public class OperatorDiv extends Operator{ @Override public Double getResult() { if (this.getNumB() == 0) { throw new RuntimeException("除数不能为0!!!"); } return this.getNumA() / this.getNumB(); } }
3、实现工厂类
/** *Jun 27, 2013 *Copyright(c)JackWang *All rights reserve *@Author <a href="mailto:wangchengjack@163.com">JackWang</a> */ package com.example.simplefactory; public class OperatorFactory { public static Operator operators(String oper){ Operator operator = null; switch (oper) { case "+": operator = new OperatorAdd(); break; case "-": operator = new OperatorSub(); break; case "*": operator = new OperatorMuti(); break; case "/": operator = new OperatorDiv(); break; default: break; } return operator; } }
4、测试
/** *Jun 27, 2013 *Copyright(c)JackWang *All rights reserve *@Author <a href="mailto:wangchengjack@163.com">JackWang</a> */ package com.example.simplefactory; public class Caculator { public static void main(String[] args) { Operator operators = OperatorFactory.operators("+"); operators.setNumA(5.0); operators.setNumB(6.0); System.out.println(operators.getResult()); Operator operators2 = OperatorFactory.operators("-"); operators2.setNumA(5.0); operators2.setNumB(6.0); System.out.println(operators2.getResult()); Operator operators3 = OperatorFactory.operators("*"); operators3.setNumA(5.0); operators3.setNumB(6.0); System.out.println(operators3.getResult()); Operator operators4 = OperatorFactory.operators("/"); operators4.setNumA(5.0); operators4.setNumB(6.0); System.out.println(operators4.getResult()); Operator operators5 = OperatorFactory.operators("/"); operators5.setNumA(5.0); operators5.setNumB(0.0); System.out.println(operators5.getResult()); } }
---------------------------------------------------------
例子改编自《大话设计模式》 作为学习记录