设计模式之----简单工厂模式
设计模式原则是“针对接口编程,而不是对实现编程”;
简单工厂模式根据提供给它的数据,返回一个类的实例。通常它返回的类都是一个公共的父类或者接口对象。
简单工厂的作用是实例化对象,而不需要客户了解这个对象属于哪个具体的子类。简单工厂实例化的类具有相同的接口或基类,在子类比较固定并不需要扩展时,可以使用简单工厂。
优点:可以使用户根据参数获得相应的类实例,避免了直接实例化类,降低了耦合性;
缺点:实例化的类型在编译期间已经被确定,如果增加新类型,则需要修改工作,不符合OCP开闭原则。
简单工厂需要知道所有要生成的类型,当子类过多或者子类层次过多时不合适使用。
公共的父类或者接口对象
/** * 设计一个计算器 * * @author foolishbird_lmy * */ class Operation { /* * 数据操作类,用于封装数据 */ public double num1; public double num2; public double getNum1() { return num1; } public void setNum1(double num1) { this.num1 = num1; } public double getNum2() { return num2; } public void setNum2(double num2) { this.num2 = num2; } //定义一个抽取的共同的结果方法 public double getResult() throws OperationDivImp { return 0; } }
下面这些类继承了父类或者去实现上面的接口,重写或者实现里面抽取的方法,例如 getResult()
//加法操作,继承封装数据类,用来操作数据 class OperationAdd extends Operation { //重写抽取的方法 public double getResult() { return num1 + num2; } } //减法操作,继承封装数据类,用来操作数据 class OperationSub extends Operation { public double getResult() { return num1 - num2; } } //乘法操作,继承封装数据类,用来操作数据 class OperationMul extends Operation { public double getResult() { return num1 * num2; } } class OperationDivImp extends Exception { /** * 自定义异常类,用来处理除法中除数是0的情况 */ private static final long serialVersionUID = 1L; public OperationDivImp(String msg) { super(msg); } } //除法操作,继承封装数据类,用来操作数据 class OperationDiv extends Operation { public double getResult() throws OperationDivImp { if (num2 == 0) { throw new OperationDivImp("除数不能为0"); } return num1/num2; } }
客户端,创建工厂实例,根据需要建立相对应的实现类型
//工厂类 class OperationFactory{ public static Operation createOperate(String operate){ Operation operation = null; switch (operate) { case "+": operation = new OperationAdd(); break; case "-": operation = new OperationSub(); break; case "*": operation = new OperationMul(); break; case "/": operation = new OperationDiv(); break; default: System.out.println("运算符号异常"); break; } return operation; } }
相应实现测试
public class 简单工厂模式 { public static void main(String[] args) throws OperationDivImp{ Operation oper = OperationFactory.createOperate("/"); oper.num1 = -1; oper.num2 = -8; double result = oper.getResult(); System.out.println(result); } }