- 出现的背景:当一个模块中使用到了一类对象,如果在使用到的位置直接具体创建出各种对象(显示new),则不易于该模块的扩展,因为当该类对象出现一种新对象时,需要修改该模块的代码,而简单工厂模式可以解决这个问题。
- 作用:专门负责某类对象(实例)的创建。更具体的来说,就是在使用这类对象的模块中通过工厂中的方法,根据用户需求创建出相应的对象实例,并令父类引用指向这个对象实例(多态),从而实现了模块与这类对象的分离,当扩展了一种新对象时,只需要修改工厂方法,而这个模块无需变动。
实例如下:
首先定义运算器接口
public interface Operation {void setNumberA(double numberA);void setNumberB(double numberB);double getResult();}
定义该运算器接口的加、减、乘、除四种实现类 ```java class OperationAdd implements Operation { public double numberA; public double numberB;
@Override public double getResult() { return numberA + numberB; }
@Override public void setNumberA(double numberA) { this.numberA = numberA; }
@Override public void setNumberB(double numberB) { this.numberB = numberB; } }
class OperationSub implements Operation { public double numberA; public double numberB;
@Overridepublic double getResult() {return numberA - numberB;}@Overridepublic void setNumberA(double numberA) {this.numberA = numberA;}@Overridepublic void setNumberB(double numberB) {this.numberB = numberB;}
}
class OperationMul implements Operation { public double numberA; public double numberB;
@Overridepublic double getResult() {return numberA * numberB;}@Overridepublic void setNumberA(double numberA) {this.numberA = numberA;}@Overridepublic void setNumberB(double numberB) {this.numberB = numberB;}
}
class OperationDiv implements Operation { public double numberA; public double numberB;
@Overridepublic double getResult() {return numberA / numberB;}@Overridepublic void setNumberA(double numberA) {this.numberA = numberA;}@Overridepublic void setNumberB(double numberB) {this.numberB = numberB;}
}
- 定义简单工厂,负责Operation实现类的创建```javapublic class OperationSimpleFactory {public static Operation createOperation(String operator){switch (operator){case "+": return new OperationAdd();case "-": return new OperationSub();case "*": return new OperationMul();case "/": return new OperationDiv();default: return null;}}}
- 客户端使用简单工厂创建运算器对象
public class CalculatorClient {public static void main(String[] args) {try {Scanner scanner = new Scanner(System.in);System.out.println("请输入第一个运算数");double numberA = scanner.nextDouble();System.out.println("请输入运算符");String operator = scanner.next();System.out.println("请输入第二个运算数");double numberB = scanner.nextDouble();Operation operation = OperationSimpleFactory.createOperation(operator);operation.setNumberA(numberA);operation.setNumberB(numberB);double result = operation.getResult();System.out.println(numberA + " " + operator + " " + numberB + " = " + result);} catch (Exception e){e.printStackTrace();}}}
