工厂模式
文档查阅说明:
定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类
使用场景:
● 日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方;
● 数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时;
● 设计一个连接服务器的框架,需要三个协议,"POP3"、"IMAP"、"HTTP",可以把这三个作为产品类,共同实现一个接口
public abstract class Operation {
private double numberA = 0;
private double numberB = 0;
public double getNumberA() {
return numberA;
}
public void setNumberA(double numberA) {
this.numberA = numberA;
}
public double getNumberB() {
return numberB;
}
public void setNumberB(double numberB) {
this.numberB = numberB;
}
public abstract double getResult();
}
public class OperationAdd extends Operation {
@Override
public double getResult() {
return this.getNumberA() + this.getNumberB();
}
}
public class OperationSub extends Operation {
@Override
public double getResult() {
return this.getNumberA() - this.getNumberB();
}
}
public class OperationMul extends Operation {
@Override
public double getResult() {
return this.getNumberA() * this.getNumberB();
}
}
public class OperationDiv extends Operation {
@Override
public double getResult() {
if(this.getNumberB() == 0) {
try {
throw new Exception("除数不能为0");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return this.getNumberA() / this.getNumberB();
}
}
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;
}
default:{
try {
throw new Exception("操作符不匹配");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return oper;
}
public static double getResult(String operate, double numberA, double numberB) {
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;
}
default:{
try {
throw new Exception("操作符不匹配");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
oper.setNumberA(numberA);
oper.setNumberB(numberB);
return oper.getResult();
}
}
public class Test {
public static void main(String[] args) {
Operation oper = OperationFactory.createOperation("+");
oper.setNumberA(1);
oper.setNumberB(2);
double result = oper.getResult();
System.out.println(result);
System.out.println(OperationFactory.getResult("+", 1, 2));
}
}