概念
简单工厂决定实例化那个对象,简单工厂是最简单的工厂模式,工厂类是整个工厂模式的关键,通过工厂类外界可以从直接创建具体产品的尴尬局面摆脱出来,不需要管对象是如何创建出来如何组织的,明确各自的职责和权力有利于软件体系结构的优化.同时将继承,多态,封装都是用在了其中,可以让程序变得易扩展.易维护,易复用,灵活性好.的四大优势
缺点:
全部的创建对象的逻辑全部集中在工厂类中,违反了高内聚责任分配原则,它所能创建的对象都是实现考虑好的,如果要添加新的对象还是需要修改工厂类
- 以下程序是实现输入数字和运算符实现计算机的功能利用简单工厂模式
- 在Operation父类中创建两个变量分别为运算数值,创建一个空的运算方法(operationMethod)
- 在子类继承父类(Operation)以后实现父类的运算方法(operationMethod)
- 工厂类主要利用运算符(Operators)判断创建的对象实例化(Operation)
- 就可以进行运算
计算机程序(Program.class)
public class Program {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入数A:");
String strNumberA = sc.nextLine();
System.out.println("请输入运算符(*,/,+,-):");
String operators = sc.nextLine();
System.out.println("请输入数b:");
String strNumberB = sc.nextLine();
//验证输入数字舒服为正常阿拉伯数字
if (strNumberA.matches("[0-9]*") && strNumberB.matches("[0-9]*")) {
Operation op = OperationFactory.createOperation(operators); //简单工厂
op.setNumberA(Double.valueOf(strNumberA));
op.setNumberB(Double.valueOf(strNumberB));
System.out.println(op.operationMethod());
}else{
System.out.println("输入的非数字,无法进行计算!!");
return;
}
}
工厂类
public class OperationFactory {
public static Operation createOperation(String operators) {
Operation op = null;
switch (operators) {
case "+":
op = new Plus();
break;
case "*":
op = new Ride();
break;
case "/":
op = new Divide();
break;
case "-":
op = new Minus();
break;
default:
break;
}
return op;
}
运算父类(Operation.class)
public class Operation {
private double numberA;
private double numberB;
public Operation(int numberA, int numberB) {
this.numberA = numberA;
this.numberB = numberB;
}
public Operation() {
}
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 double operationMethod() {
return 0;
}
}
乘法类(Ride.class)
public class Ride extends Operation {
@Override
public double operationMethod() {
return getNumberA() * super.getNumberB();
}
}
除法类(Divide.class)
public class Divide extends Operation {
@Override
public double operationMethod() {
if (getNumberA() == 0.0 || getNumberB() == 0.0) {
System.out.println("除数或被除数不能为0");
return 0;
}
return getNumberA() / getNumberB();
}
}
加法类(Plus.class)
public class Plus extends Operation {
@Override
public double operationMethod() {
return getNumberA() + getNumberB();
}
}
减法类(Minus.class)
public class Minus extends Operation {
@Override
public double operationMethod() {
return getNumberA() - getNumberB();
}
}