【问题标题】:OO - Creating object using a method of no argumentOO - 使用无参数方法创建对象
【发布时间】:2013-11-30 09:53:21
【问题描述】:

我在理解 OO 模式的工作原理方面遇到了一些问题,我的讲师给了我以下问题,但我思考了一整天后无法解决

我的问题的场景。

有一个名为“ShapeManager”的类来管理 Shape 对象。一个名为“Shape”的类有两个名为“Circle”和“Rectangle”的子类

Shape类的实现如下

abstract public class Shape {
    private String id;
    private double length;

    public Shape() {

    }
    public Shape(String id , double length) {
        this.id = id;
        this.length = length;
    }
    public void setID(String id) {
        this.id = id;
    }
    public String getID() {
        return id;
    }
    public void setLength(double length) {
        this.length = length;
    }
    public double getLength() {
        return length;
    }
    public abstract String getDetails();

}

子类Square如下

public class Square extends Shape{

    public Square() {
        super();
   }
    public Square(String id , double side) {
        super(id, side);
    }

    @Override
    public String getDetails() {
        return "Square => Id : "+getID() +", Side : "+ getLength() + ",Area : "+(getLength() * getLength());
    }
}

子类Circle如下

public class Circle extends Shape{
    public Circle(){
        super();
    }
    public Circle (String id, double radius) {
        super(id, radius);

    }

    @Override
    public String details() {        
        return "Circle => Id : "+getID() + ", Radius : "+ getLength() + ",Area: "+(3.14*(getLength() * getLength()));
    }
}

ShapeManager类如下,这不是一个完整的类

public class ShapeManager {
    public Shape createShape() {

    }
    public void updateLength(String id ){

    }
    public void deleteShape(String id) {

    }
    public void listShapes() {

    }

}

ShapeManagerShape

有关联
 ShapeManager --1-----0..*--> 形状

这个包的设计(以上所有类)不能改变,实现必须遵循OCP(Open-Closed Principle)。

我的问题是:我应该如何完成 createShape 方法?如果没有参数,似乎不可能创建一个 Rectangle 或 Circle 对象。

【问题讨论】:

  • @subash 听起来好像没有参数就可以了
  • 我认为我在这个问题的最后一行很清楚?
  • 告诉你的讲师Manager 是一个糟糕的名字Factory
  • 缺少的是 createShape 方法应该做的事情。
  • 它说它是一个不完整的类。 Narendra,据我所知,ShapeManager 不仅仅是一家工厂。

标签: java oop


【解决方案1】:

如果不知道形状是什么(方形、圆形或其他),ShapeManager 无法创建形状。它真的不知道,因为你说方法 createShare 没有参数。要么你误解了这个问题,要么讲师没有很好地解释它。您应该要求他/她进行澄清。如果您查看 Java 或任何其他 OO 语言的库,我很确定您不会找到您在示例中给出的场景和实现模式。


@croraf

你应该找到一些我认为的其他读物,例如经典书籍http://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612。工厂的主要思想是它返回调用者不知道且不关心的类型。例如,如果你在某个 SocketFactory 中有一个方法 createSocket(),这个方法通常被定义为返回一个接口或一个抽象类 Socket。但实际上它返回的是具体的类 new SocketImpl1() 和 new SocketImpl2()。工厂返回的内容可能取决于很多东西——系统属性、底层操作系统、任何你能想到的东西。主要思想是工厂将 Socket 对象的创建集中在一个地方。这样,如果您需要进行更改,您可以在工厂进行。我认为这本书也有一些不错的 Java 对应物,你可以四处看看。此处引用了其他免费的优质资源。

Real world examples of Factory Method pattern

【讨论】:

    【解决方案2】:

    我认为你应该有这样的东西,类似于 java API 中的 BorderFactory 的工作方式。

    public class ShapeManager {
        public Shape createCircle() {
                ...
                return Circle;
        }
         public Shape createSquare() {
                ....
                return Square;
        }
          ...
    
       public void updateLength(String id ){
    
    }
    public void deleteShape(String id) {
    
    }
    public void listShapes() {
    
    }
    
    }
    

    【讨论】:

    【解决方案3】:

    如果不知道要创建哪种形状,就无法创建形状。您可以定义类型的枚举并将类型值传递给createShape()。在那里您可以在类型之间切换并创建您想要的具体形状。

    【讨论】:

    • 我也是这么说的。所以我同意。这个任务/作业在我看来也没有正确说明。
    【解决方案4】:

    对我来说,它的经典Factory pattern

    public class ShapeFactory {
      public abstract Shape getShape(int shapeId);
    }
    
     public interface Const {
      public static final int SHAPE_CIRCLE =1;
      public static final int SHAPE_SQUARE =2; 
    }
    
    
    public class SimpleShapeFactory extends ShapeFactory throws BadShapeException {
       public Shape getShape(int shapeTypeId){
        Shape shape = null;
        if(shapeTypeId == Const.SHAPE_CIRCLE) {
    
        //in future can reuse or cache objects.
          shape = new Circle();
        }
        else if(shapeTypeId == Const.SHAPE_SQUARE) {
          //in future can reuse or cache objects
          shape = new Square();
         }
        else throw new BadShapeException("ShapeTypeId="+ shapeTypeId);
        return shape;
      }
    }
    

    调用:

    ShapeFactory factory = new SimpleShapeFactory();
    
    //returns a Shape but whether it is a Circle or a
    //Square is not known to the caller.
    Shape s = factory.getShape(1);
    s.getDetails(); // circle details called
    //returns a Shape but whether it is a Circle or a
    //Square is not known to the caller.
    s = factory.getShape(2);
    s.getDetails(); //Square details called
    

    参考文献

    Open Close Principle 声明代码的设计和编写应该以一种在现有代码中最少更改 的方式添加新功能的方式完成。设计应该以允许将新功能添加为新类的方式完成,尽可能保持现有代码不变。

    【讨论】:

    • 我认为添加一个指向您提取开/关原则定义的资源的链接会改善响应
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-18
    • 1970-01-01
    • 2021-12-11
    • 2019-09-09
    • 2020-11-11
    • 2018-03-27
    • 2016-08-26
    相关资源
    最近更新 更多