信息发布→ 登录 注册 退出

Java设计模式之原型模式的示例详解

发布时间:2026-01-11

点击量:
目录
  • 定义
  • 案例
    • 需求
    • 方案一
    • 方案二
  • 对比分析
    • 总结

      定义

      用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 即实现了一个原型接口,该接口用于创建当前对象的克隆,当直接创建对象的代价比较大时,则采用这种模式

      案例

      需求

      张三要打印100000份照片

      方案一

      定义照片类

      /**
       * 照片类
       * @author:liyajie
       * @createTime:2025/2/15 11:47
       * @version:1.0
       */
      @Data
      @AllArgsConstructor
      public class Photo {
          private String name;
          private String type;
          private int size;
      }

      定义客户端类

      /**
       * 客户端
       * @author:liyajie
       * @createTime:2025/2/15 11:49
       * @version:1.0
       */
      public class Client {
      
          public void printPhoto(){
              Photo photo = new Photo("张三","彩色",2);
              for (int i = 0; i < 100000; i++) {
                  Photo clone = new Photo(photo.getName(),photo.getType(),photo.getSize());
                  System.out.println(clone);
              }
          }
      }

      定义测试类

      /**
       * 测试类
       * @author:liyajie
       * @createTime:2025/2/15 11:51
       * @version:1.0
       */
      public class Test {
          public static void main(String[] args) {
              Client client = new Client();
              client.printPhoto();
          }
      }

      测试结果

      方案二

      定义照片类

      /**
       * 照片类
       * @author:liyajie
       * @createTime:2025/2/15 11:47
       * @version:1.0
       */
      @Data
      @AllArgsConstructor
      public class PhotoNew implements Cloneable{
          private String name;
          private String type;
          private int size;
      
          @Override
          protected PhotoNew clone() {
              PhotoNew clone = null;
              try {
                  clone = (PhotoNew)super.clone();
              }catch (Exception e){
                  e.printStackTrace();
              }
              return clone;
          }
      }

      定义客户端类

      /**
       * 客户端
       * @author:liyajie
       * @createTime:2025/2/15 11:49
       * @version:1.0
       */
      public class ClientNew {
      
          public void printPhoto(){
              PhotoNew photoNew = new PhotoNew("张三","彩色",2);
              for (int i = 0; i < 100000; i++) {
                  PhotoNew clone = photoNew.clone();
                  System.out.println(clone);
              }
          }
      }

      定义测试类

      /**
       * 测试类
       * @author:liyajie
       * @createTime:2025/2/15 11:51
       * @version:1.0
       */
      public class TestNew {
          public static void main(String[] args) {
              ClientNew clientNew = new ClientNew();
              clientNew.printPhoto();
          }
      }

      测试结果

      对比分析

      • 方案一:一般实现方法,使用for循环进行多次new实例化照片对象,该方案最多大的优势就是简单,容易理解;劣势就是多次使用new关键字,频繁的进行内存分配等,如果量大到一定的程度,性能会非常差
      • 方案二:原型模式实现方法,要实例化多次的类实现Cloneable,重写clone方法,使用for循环重复调用clone方法进行多次实例化,即是在内存中使用拷贝的方式进行创建对象,性能比new关键字会高很多

      总结

      通过以上两个方案的耗时比较,我们可以发现使用原型模式创建对象性能最优,所以在以下场景中我们可以选择使用原型模式:

      1.当需要一个类的大量对象的时候

      2.如果一个对象初始化太过繁琐

      在线客服
      服务热线

      服务热线

      4008888355

      微信咨询
      二维码
      返回顶部
      ×二维码

      截屏,微信识别二维码

      打开微信

      微信号已复制,请打开微信添加咨询详情!