设计模式-工厂模式-记运行ShapeFactoryDemo排错

Posted rickyzhu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式-工厂模式-记运行ShapeFactoryDemo排错相关的知识,希望对你有一定的参考价值。

记一次运行工厂类实例 ShapeFactoryDemo 排错

问题描述

对设计模式的工厂模式进行实例运行,发现声明接口类型的引用对象获取到 getShape() 方法返回的值是 null 而不是预想的 Shape 接口的实现类的实例对象

工厂模式--UML图

技术图片技术图片

开发工具

IntellJ IDEA

  • 控制台输出

     Exception in thread "main" java.lang.NullPointerException
      at factorypattern.FactoryPatternDemo.main(FactoryPatternDemo.java:11)
    
    

    报错的内容是“空指针”

我也是懵逼的

  • 定位到 FactoryPatternDemo.java 行 11 处以及之前的代码

        ShapeFactory shapeFactory = new ShapeFactory();
        System.out.println(shapeFactory.getShape("CIRCLE"));
        // 获取 Circle 的对象,并调用它的 draw 方法
        Shape shape1 = shapeFactory.getShape("CIRCLE");
        // 调用 Circle 的draw 方法
        shape1.draw();
    

这语句执行出 空指针错误,是shape1 指向了空对象

我们向上回溯shape1 指针应该是指向通过 shapeFactory 的 getshape()方法创建的对象,shapeFactory的getshape方法定义如下

 public Shape getShape(String shapeType){
     if (shapeType == null){
         return null;
     }

     if (shapeType.equalsIgnoreCase("CIRECLE")){
         return new Circle();
     }else if(shapeType.equalsIgnoreCase("RECTANGLE")){
         return new Rectangle();
     }else if(shapeType.equalsIgnoreCase("SQUARE")){
         return new Square();
     }
     return null;
 }

即给shape方法传入字符串参数对应创建已有可匹配的三个图形类,否则就传回null值

分析

那么可以说明main方法里传入的参数值在shape方法里没有匹配上值,于是传回了空值导致 shape 类型的对象变成了空指针。

而以上代码可以看出main方法里并无任何拼写或者语法上的错误,最后当我看向getshape()方法体里if循环的判定条件,是比较的字符串样本--“CIRCLE”错误最终改回来后运行时控制台输出显示:

 factorypattern.Circle@4554617c
 Inside Circle::draw() method.
 Inside Rectangle::draw() method.
 Inside Square::draw() method.

运行成功,三个方法执行并输出

以上

以上是关于设计模式-工厂模式-记运行ShapeFactoryDemo排错的主要内容,如果未能解决你的问题,请参考以下文章

设计模式-工厂模式-记运行ShapeFactoryDemo排错

工厂模式

Java 工厂模式——简单工程模式

工厂模式(Factory Pattern)和java反射机制优化思考

[Design Pattern] Factory Pattern 简单案例

巧记设计模式