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

Java 在这种情况下,原型模式的好处是什么,java,design-patterns,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 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.");
   }
}
创建一个类以从数据库中获取具体类并将其存储在哈希表中:

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);
   }
}
以及: 实施2:

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

我尝试了这两个实现,它们工作得很好,只是我想知道如果使用第一个实现的好处。实现1返回一个新对象。更改该对象不会更改shapeMap中的对象

实现2返回shapeMap中的确切对象。如果更改此选项,则shapeMap中的对象将更改


因此,这完全取决于您希望对方法的结果做什么。

我听说您的所有输入实际上与您在文本中提出的最后一个问题是如何关联的,但让我们尝试一下:基本区别是:选项1每次都创建缓存对象的副本

而选项2。。。为您提供缓存的对象本身

当您谈到一个缓存和一个getter方法时,使用选项1找到的实际代码至少令人惊讶

换句话说:大多数人都认为缓存是向用户提供相同的对象(这就是缓存的全部意义!)

所以,我的观点是:看来克隆对你的设计很重要。如果是这样的话,那么你应该重新考虑在那里设置缓存的想法。那个缓存更像一个包含“模式”的“模板引擎”,并允许您复制这些“模式”吗?但最终,这里的指导因素不是我们的想法,而是在你的领域中最有意义的东西。这是我们无法帮助的


长话短说:类和你放入其中的功能。。。不存在于真空中。创建它们是为了实现解决问题的“心智模型”。你是应该理解你想要解决的问题的人。这将推动您的实现。如前所述;我们无法提供确切的细节。

谢谢你,我现在明白了这两种选择之间的区别。我确实喜欢你解释的;)我不是OP:P
 public static Shape getShape(String shapeId) {
      Shape cachedShape = shapeMap.get(shapeId);
      // return (Shape) cachedShape.clone();
     return  cachedShape ;
   }