Java原型模式

来源:互联网 发布:mac http 抓包工具 编辑:程序博客网 时间:2024/06/12 03:04
Java原型模式


原型模式指在创建重复对象的同时保持性能。 这种类型的设计模式属于创建模式,因为此模式提供了创建对象的最佳方法之一。


这个模式涉及实现一个原型接口,它只创建当前对象的克隆。有时直接创建对象时使用这种模式是昂贵的。例如,在昂贵的数据库操作之后创建对象。因此我们可以缓存对象,在下一个请求时返回其克隆,并在需要时更新数据库,从而减少数据库调用。


实现实例


我们将创建一个抽象类Shape和扩展Shape类的具体类。 在下一步中定义ShapeCache类,在Hashtable中存储形状(Shape)对象,并在请求时返回其克隆。


PrototypPatternDemo这是一个演示类,将使用ShapeCache类来获取一个Shape对象。实现结构图如下所示 -






第1步


创建一个实现Clonable接口的抽象类。


Shape.java




 
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;
   }
}
Java
第2步


创建扩展上述类的具体类。


Rectangle.java


public class Rectangle extends Shape {


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


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


public class Square extends Shape {


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


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




public class Circle extends Shape {


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


   @Override
   public void draw() {
      System.out.println("Inside Circle::draw() method.");
   }
}
Java
第3步


创建一个类来获取具体的类,并将它们存储在Hashtable中。


ShapeCache.java


import java.util.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();
   }


   // for each shape run database query and create shape
   // shapeMap.put(shapeKey, shape);
   // for example, we are adding three shapes


   public static void loadCache() {
      Circle circle = new Circle();
      circle.setId("1");
      shapeMap.put(circle.getId(),circle);


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


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


PrototypePatternDemo使用ShapeCache类来获取存储在Hashtable中的形状(shape)的克隆。


PrototypePatternDemo.java




public class PrototypePatternDemo {
   public static void main(String[] args) {
      ShapeCache.loadCache();


      Shape clonedShape = (Shape) ShapeCache.getShape("1");
      System.out.println("Shape : " + clonedShape.getType());        


      Shape clonedShape2 = (Shape) ShapeCache.getShape("2");
      System.out.println("Shape : " + clonedShape2.getType());        


      Shape clonedShape3 = (Shape) ShapeCache.getShape("3");
      System.out.println("Shape : " + clonedShape3.getType());        
   }
}
Java
第5步


验证输出,执行上面的代码得到以下结果 -


Shape : Circle
Shape : Square
Shape : Rectangle