当然实际代码中, 不能像上面这样天马行空, 术业还是要有专攻的, 比如一个工厂专门生产各种各样的女朋友, 额..
比如 iphon 的工厂专门生产各种型号的 ipone.
把这个思想用到我们的程序中, 我们需要一个工厂, 接受一个参数, 然后它就能返回相应的对象:
- package designpattern.staticfactorymethod;
- public class CalculateFactory {
- public static Calculate create(String operate) {
- switch (operate) {
- case "+":
- return new Plus();
- case "-":
- return new Minus();
- case "*":
- return new Multiply();
- case "/":
- return new Divide();
- }
- return null;
- }
- }
前面的类都新增了一个默认的构造方法, 就是为了这里用, 我也思考过, 可不可以用统一的带参数构造方法, 但我看好像没有人这么写, 肯定有它的道理, 这里写下自己粗浅的理解, 欢迎交流, 指正:
工厂的任务只是生产对象, 加上参数就相当于和业务搅在一起, 变得很不灵活, 今天你只想初始化汽车的品牌, 明天你又想初始化汽车的颜色, 这样, 你汽车类, 工厂类, 调用工厂的类全要改, 如果只是默认的构造方法的话, 至少你的工厂类是不用改的.
接下来看调用的方法:
- package designpattern.staticfactorymethod;
- import java.util.Scanner;
- public class Calculator4 {
- public static void main(String[] args) {
- Scanner scanner = new Scanner(System.in);
- System.out.println("请输入一个数字");
- double num1 = scanner.nextDouble();
- System.out.println("请输入一个运算符:+,-,*,/");
- String operator = scanner.next();// 不能用 nextLine(), 会把上一个回车给吸收
- System.out.println("请输入一个数字");
- double num2 = scanner.nextDouble();
- Calculate calculate = CalculateFactory.create(operator);
- calculate.num1 = num1;
- calculate.num2 = num2;
- System.out.println(calculate.calculate());
- scanner.close();
- }
- }
这回多态也出场了, 通过多态, 统一用父类接受创建的具体子类, 当需要增加运算方式时, 只需要修改工厂类和具体的运算类, 调用的地方不用变, 降低了模块间的耦合性, 提高了系统的灵活性.
来源: https://www.cnblogs.com/imoqian/p/10244577.html