标签:
今天,我们来谈一谈工厂模式三部曲之一——简单工厂模式(静态工厂模式)。
首先,先谈一下工厂模式吧,工厂模式根据抽象程度的不同划分为三种:简单工厂模式,工厂方法模式以及抽象工厂模式。它是编程中经常用到的一种模式哦。那么为什么这么受欢迎呢?
1.可以使代码清晰,有效地封装变化。通过工厂模式将产品的实例化封装起来,调用者无需关心产品的实例化过程,只需要依赖工厂即可得到自己想要的产品。
2.降低耦合度。产品类的实例化通常需要依赖很多的类,而这些类对于调用者来说根本无需知道,使用了工厂方法,我们需要做的仅仅是实例化好产品类,然后交给调用者使用。对于调用者来说,产品所依赖的类都是透明的。
3.对调用者屏蔽具体的产品类。调用者只关心产品的接口就可以了,至于具体的实现,调用者根本无需关心。即使变更了具体的实现,对调用者来说没有任何的影响。
简单工厂模式,一般具有三个要素,工厂类,产品接口和产品的实现。
下面以简单的计算器案例加以说明。
类图如下:
项目目录如下:
三个要素,工厂类是OperationFactory,负责创建产品对象。产品接口是Operation,里面定义了getResult()方法。AddOperation,SubOperation,MulOperation,DivOperation分别是产品的具体实现。代码如下:
Operation:
public abstract class Operation { private double number1; private double number2; public double getNumber1() { return number1; } public void setNumber1(double number1) { this.number1 = number1; } public double getNumber2() { return number2; } public void setNumber2(double number2) { this.number2 = number2; } public abstract double getResult(); }
AddOperation:
public class AddOperation extends Operation { @Override public double getResult() { return getNumber1() + getNumber2(); } }
SubOperation:
public class SubOperation extends Operation { @Override public double getResult() { return getNumber1() - getNumber2(); } }
MulOperation:
public class MulOperation extends Operation { @Override public double getResult() { return getNumber1() * getNumber2(); } }
DivOperation:
public class DivOperation extends Operation { @Override public double getResult() { if("0".equals(getNumber2()+"")){ throw new RuntimeException("除数不能为0"); } return getNumber1() / getNumber2(); } }
OpertionFactory:
public class OperationFactory { public static Operation createOperation(String op){ Operation oper = null; switch (op) { case "+": oper = new AddOperation(); break; case "-": oper = new SubOperation(); break; case "*": oper = new MulOperation(); break; case "/": oper = new DivOperation(); break; default: oper = null; } return oper; } }
测试:
Operation oper = OperationFactory.createOperation("-"); oper.setNumber1(1); oper.setNumber2(3.5); System.out.println(oper.getResult());
标签:
原文地址:http://www.cnblogs.com/DarrenChan/p/5661356.html