生活示例
刻板印刷–>活字印刷举例:喝酒唱歌,人生真爽。–>对酒当歌,人生几何。
可维护:需要修改,则只需要改需要改的字即可。
可复用:字体可在后来的印刷复用。
可扩展:需要加字,只需要加入相应的刻字即可。
灵活性好:字的排列可能竖排或横排,只需要活字移动即可。
代码示例
需求
实现一个简易计算器功能。
UML
代码
package simpleFactory;
/**
* Created by yutong on 2018/11/4
* 工厂类
*/
public class OperationFactory {
public static Operation createOperation(String operate){
Operation oper = null;
switch (operate){
case "+":
oper = new OperationAdd();
break;
case "-":
oper = new OperationSub();
break;
case "*":
oper = new OperationMul();
break;
case "/":
oper = new OperationDiv();
break;
}
return oper;
}
}
package simpleFactory;
/**
* Created by yutong on 2018/11/4
* 运算类
*/
public class Operation {
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;
}
public double getResult() throws Exception {
double result = 0;
return result;
}
}
package simpleFactory;
/**
* Created by yutong on 2018/11/4
* 加法
*/
public class OperationAdd extends Operation {
@Override
public double getResult() {
return getNumA() + getNumB();
}
}
package simpleFactory;
/**
* Created by yutong on 2018/11/4
* 减法
*/
public class OperationSub extends Operation{
@Override
public double getResult() {
return getNumA() - getNumB();
}
}
package simpleFactory;
/**
* Created by yutong on 2018/11/4
* 乘法
*/
public class OperationMul extends Operation {
@Override
public double getResult() {
return getNumA() * getNumB();
}
}
package simpleFactory;
/**
* Created by yutong on 2018/11/4
* 除法
*/
public class OperationDiv extends Operation {
@Override
public double getResult() throws Exception {
if (getNumB() == 0){
throw new Exception("0不能做除数!");
}
return getNumA()/getNumB();
}
}
package simpleFactory;
import java.util.Scanner;
/**
* Created by yutong on 2018/11/4
* 计算器client类
*/
public class Counter {
public static void main(String[] args){
try {
System.out.println("======欢迎来到我的计算机世界=======");
System.out.println("请输入您要计算的第一个数字:");
Scanner scanner = new Scanner(System.in);
String numA = scanner.next();
System.out.println("请输入您要计算的第二个数字:");
String numB = scanner.next();
System.out.println("请输入运算符:");
String oper = scanner.next();
Operation operation = OperationFactory.createOperation(oper);
operation.setNumA(Double.parseDouble(numA));
operation.setNumB(Double.parseDouble(numB));
System.out.println("计算结果为:"+operation.getResult());
} catch (Exception e) {
System.out.println("您输入有误"+e);
}
}
}
总结
代码是有艺术性的。将算法和界面解耦合(封装),将算法松耦合(继承&多态)。
简单工厂模式优缺点
优点:
使用户根据参数获得对应的类实例,避免了直接实例化类,降低了耦合性。
缺点:
可实例化的类型在编译期间已经被确定,如果增加新类型,则需要修改工厂,违背了开放封闭原则(ASD) 。 简单工厂需要知道所有要生成的类型,当子类过多或者子类层次过多时不适合使用。
使用场景
工厂类负责创建的对象比较少。
客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心。