设计模式六-原型模式

原型模式是一种常用的创建型设计模式,它通过复制现有对象来创建新对象,从而避免了重复创建对象的开销。以下是原型模式的一些应用场景及 Java 实例:

应用场景:

  1. 当一个对象需要在不同的上下文中多次使用时,可以使用原型模式来避免重复创建该对象,从而提高程序性能。

  2. 当一个对象的创建过程比较复杂,需要消耗大量时间和资源时,可以使用原型模式来减少创建对象的开销。

  3. 当一个对象需要在运行时动态创建时,可以使用原型模式来根据需要复制已有对象。

Java 实例:

以下是一个简单的 Java 实例,演示了如何使用原型模式来创建和复制对象:

public abstract class Shape implements Cloneable {
   private String id;
   protected String type;
   
   public String getType(){
      return type;
   }
   
   public String getId() {
      return id;
   }

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

   public abstract void draw();

   public Object clone() {
      Object clone = null;

      try {
         clone = super.clone();

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

      return clone;
   }
}

public class Circle extends Shape {

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

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

public class Rectangle extends Shape {

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

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

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());		
   }
}

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() {
      Circle circle = new Circle();
      circle.setId("1");
      shapeMap.put(circle.getId(),circle);

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

      // ...

   }
}

以上示例中,ShapeCache 类维护了一个 Hashtable,用于存储不同类型的 Shape 对象,通过 getShape() 方法来获取对象,而对象的创建和初始化则是在 loadCache() 方法中进行的。Shape 类是一个抽象类,通过实现 Cloneable 接口,可以实现对象的克隆。具体的 Shape 子类(如 CircleRectangle)实现了 draw()

方法,用于绘制具体的形状。在 main() 方法中,通过 ShapeCache 来获取不同类型的 Shape 对象,并打印出其类型。

在上述示例中,当需要创建一个新的形状时,只需要调用 ShapeCache.getShape() 方法即可。这个方法会在内存中查找对应的 Shape 对象,并进行复制。由于复制对象比创建新对象的成本要低得多,因此使用原型模式能够提高程序的性能和效率。

需要注意的是,原型模式在实际应用中需要谨慎使用。如果被复制的对象有引用类型的成员变量,那么这些成员变量将会被浅复制,而不是深复制。这可能会导致一些意外的问题,因此在使用原型模式时需要仔细考虑这些因素。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值