• 设计模式笔记 简单工厂模式


      工厂模式三姐妹中,简单工厂无疑是最简单的。无论多简单的方法,放对了位置便是最佳实现,所以简单工厂在特定情况下还是有应用市场的。

    定义:简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。

      总感觉百度百科上的这种定义说了等于没说。由于过于简单,所以在解释上会显得更繁琐,就像不能解释为什么1+1=2一样。

      UML类图如下

      具体实现中,产品类可以是接口(interface)或者是抽象类(abstract class),下面沿用《大话设计模式》一书中的例子(简单计算器的开发)加以说明。

      首先是产品类,这里是运算符类,两个操作数参数和一个运算方法,此处用的是抽象类:

    public abstract class Operation {
        private double numberA;
        private double numberB;
    
        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 getNumberA() + getNumberB();
        }
    }
    public class OperationSub extends Operation {
    
        @Override
        public double getResult() {
            return getNumberA() - getNumberB();
        }
    }
    public class OperationMul extends Operation {
    
        @Override
        public double getResult() {
            return getNumberA() * getNumberB();
        }
    }
    public class OperationDiv extends Operation {
    
        @Override
        public double getResult() {
            return getNumberA() / getNumberB();
        }
    }
    

       工厂类即是创建运算类的类

    public class OperationFactory {
    
        public static Operation createOperation(String what) {
            switch (what) {
            case "+":
                return new OperationAdd();
            case "-":
                return new OperationSub();
            case "*":
                return new OperationMul();
            case "/":
                return new OperationDiv();
    
            default:
                return null;
            }
        }
    }
    

      最后是客户端,调用

    import java.util.Scanner;
    
    public class POC {
        public static void main(String[] args) {
            coal();
        }
    
        public static void coal() {
            try {
                double numberA, numberB;
                String opr;
                @SuppressWarnings("resource")
                Scanner sc = new Scanner(System.in);
                System.out.println("输入第一个数字:");
                String numberAStr = sc.next();
    
                numberA = Double.parseDouble(numberAStr);
                System.out.println("输入操作符:");
                opr = sc.next();
    
                System.out.println("输入第二个数字:");
                String numberBStr = sc.next();
                numberB = Double.parseDouble(numberBStr);
    
                Operation operation = OperationFactory.createOperation(opr);
                operation.setNumberA(numberA);
                operation.setNumberB(numberB);
                System.out.println("结果是:"+operation.getResult());
            } catch (Exception e) {
                System.out.println("输入有误,请重新开始。。。");
                coal();
            }
        }
    }
    

     

      可是,我们为什么要用它呢?我们可以直接在客户端调用时直接new出对象,或者直接swith输入的操作符字符再做运算不就好了?这就牵涉到开发中需求更改或后期维护了。如果在这一模块开发完成后,突然需要一个开根号的运算需求,该如何做呢?如果没有用简单工厂,必将修改客户端代码。必须重新创建运算对象或更改对象。如果有成千上万个客户端呢?使用简单的目的在于:

    直接目的:避免在代码中出现大量的new关键字
    根本目的:将对象的创建统一起来便于维护和整体把控

      使用工厂后,在运算需求更改或添加时,我们只需更改工厂类即可完成。

      当然,万物有利有弊。工厂模式的弊端在于:

    每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。

      简单工厂这种没有什么技术上的难度,纯粹是依照一些业务场景而出现的设计模式,甚至不属于23种GOF设计模式之一,是不同工厂模式的一个特殊实现。

  • 相关阅读:
    Oracle专家高级编程 第二章 服务器和文件
    Oracle专家高级编程 第一章
    Leetcode 4 寻找两个正序数组的中位数
    Leetcode 3 无重复字符的最长子串
    Leetcode 2 两数相加
    Leetcode 1 两数之和
    gitee开源许可证
    js新特性展开符的使用方式
    webpack高速配置
    JS中日期比较时斜杠与横杠的区别
  • 原文地址:https://www.cnblogs.com/adamJin/p/7054983.html
Copyright © 2020-2023  润新知