在这种情况下原型模式的好处是什么

时间:2016-11-04 10:00:24

标签: java design-patterns

我看到一些代码以这种方式定义了原型模式:

public abstract class Shape implements Cloneable {

   private String id;
   protected String type;

   abstract void draw();

   public String getType(){
      return type;
   }

   public String getId() {
      return id;
   }

   public void setId(String id) {
      this.id = id;
   }

   public Object clone() {
      Object clone = null;

      try {
         clone = super.clone();

      } catch (CloneNotSupportedException e) {
         e.printStackTrace();
      }

      return clone;
   }
}

扩展上述课程的两个具体课程:

public class Rectangle extends Shape {

   public Rectangle(){
     type = "Rectangle";
   }

   @Override
   public void draw() {
      System.out.println("Inside Rectangle::draw() method.");
   }
}
public class Square extends Shape {

   public Square(){
     type = "Square";
   }

   @Override
   public void draw() {
      System.out.println("Inside Square::draw() method.");
   }
}

创建一个类以从数据库中获取具体类并将它们存储在Hashtable中:

public class ShapeCache {

   private static Hashtable<String, Shape> shapeMap  = new Hashtable<String, Shape>();

   public static Shape getShape(String shapeId) {
      Shape cachedShape = shapeMap.get(shapeId);
      return (Shape) cachedShape.clone();
   }


   public static void loadCache() {

      Square square = new Square();
      square.setId("2");
      shapeMap.put(square.getId(),square);

      Rectangle rectangle = new Rectangle();
      rectangle.setId("3");
      shapeMap.put(rectangle.getId(), rectangle);
   }
}

我的问题在于getShape方法,这两种实现之间的区别和好处是什么:

实施1:

  public static Shape getShape(String shapeId) {
      Shape cachedShape = shapeMap.get(shapeId);
      return (Shape) cachedShape.clone();
   }

并且: 实施2:

 public static Shape getShape(String shapeId) {
      Shape cachedShape = shapeMap.get(shapeId);
      // return (Shape) cachedShape.clone();
     return  cachedShape ;
   }

我尝试了两种实现,它们运行良好只是我想知道如果我使用第一个实现

的好处

2 个答案:

答案 0 :(得分:3)

实现1返回一个新对象。更改该对象不会更改shapeMap中的对象。

实现2返回shapeMap中的确切对象。如果更改它,shapeMap中的对象将被更改。

所以这一切都取决于你对你的方法的结果到底想要做什么。

答案 1 :(得分:3)

我有一段时间了解您的所有输入实际上与您在文本中提出的最终问题的关系,但我们尝试:根本区别在于:选项1创建缓存对象的复制每一次。

而选项2 ...为您提供了缓存的对象。

在您谈论缓存 getter 方法时,使用选项1找到的实际代码令人惊讶表示最小。

换句话说:大多数人都希望缓存是为用户提供相同的对象(即整个缓存!)。

所以,我的观点是: cloning 似乎对您的设计很重要。如果是这样,那么你应该重新思考你在那里有一个缓存的想法。这个缓存更像是一个&#34;模板引擎&#34;包含&#34;模式&#34;并允许你复制那些&#34;模式&#34;?但最终,这里的指导因素不是我们的想法,而是在你的中最有意义的。这是我们无法帮助的。

长话短说:你投入其中的课程和功能......不存在于某种真空中。你创建它们来实现一个心理模型&#34;存在是为了解决问题。而且你是应该理解你想要解决的问题的人。这推动了您的实施。如上所述;我们无法提供相关详细信息。