Java 原型设计模式对象创建

8

我正在学习原型设计模式,并有一些问题。

我理解原型设计模式用于创建在内存或资源方面成本高昂的对象。在这种情况下,我们使用已经存在的对象的克隆。

那么创建一个new对象和clone()有什么区别?对象存储在哪里的内存中?


这可能对你有帮助:https://dev59.com/4kbRa4cB1Zd3GeqP4--u - Nandkumar Tekale
3个回答

5
Java中的clone()方法只是创建一个新对象并将成员变量值复制到其中。一般来说,它既不比创建新对象更昂贵,也不比创建新对象更便宜。使用clone()方法比使用new创建对象更便宜的唯一情况是:当对象的构造函数执行某些昂贵的操作时。例如,如果构造函数接收参数并将其用作数据库查询的一部分,那么在这种情况下使用clone()会更便宜,因为昂贵的查询操作将不会发生。
然而,还有其他原因可以使用这种设计模式,主要是当对象在使用之前需要进行复杂设置,而这些设置不能方便地在构造函数中完成。想象一下,如果一个对象有20个需要设置的属性,如果你使用构造函数参数来设置它们,那么构造函数将非常丑陋 -- 想象一下有20个参数的构造函数!相反,你可以使用可能没有参数的构造函数来构造对象,使用修改器方法设置20个值,然后使用clone()方法创建预先准备好的副本。clone()方法根本不需要任何参数,所以很明显它更简洁。如果你需要多个不同版本的此对象的多个副本,则原型模式变得很有吸引力。

4
原型设计模式提供了两种成本节省方式:时间节省和空间节省。
当创建对象需要昂贵的访问辅助信息时(例如从文件、数据库或网络请求配置数据),时间节省发挥作用。例如,如果您正在从存储在 Web 服务器上的模板构建大量页面,则读取模板一次并克隆它以获取每个新页面的起始点比为每个页面单独查询 Web 服务器更便宜。
内存节省来自于重复使用不可变对象:如果原始对象包含大量字符串,则创建新实例需要创建全新的不可变字符串或手动处理字符串插入。通过优雅地使用原型模式,可以避免这个问题,让克隆体共享模板的不可变部分。

将不可变字段在对象之间共享是享元模式,而不是原型模式。这两种模式都很有价值,可以一起使用,但它们是独立的模式。 - jaco0646

0

原型设计模式是在创建对象占用过多系统资源和性能时使用的,我们恰好在想要拥有许多类实例且这些实例相似时使用此设计模式,因此我们不希望使用例如“new”运算符,因为它会非常昂贵,我们所需的只是基于已创建的第一个对象来实例化这些对象。

优点是新对象将是独立的,并且创建它所需的资源不会像第一个对象那样高昂。 以下是在Java中使用此概念的示例:

  import java.util.Vector;

 public class Samsung implements Cloneable{
    private Vector<String> models; 

    public Samsung(){
        models=new Vector<>(); 
        //we suppose in this comments we access to a data Base to get models
        //and then we get a full list of Samsung models
        //... and finish
        //Sadly we took to much of time to fetch the database 
        //we don't want to waste our time again because Samsung rarely update its database
        models.add("Samsung S1"); 
        models.add("Samsung S2"); 
        models.add("galaxy note"); 
        models.add("galaxy star");
    }
    public Samsung(Vector<String> models){
        this.models=models;
    }

   public Samsung clone()  {

      Vector<String> modelsCopy=new Vector<>();
      Samsung samsungCopy=null;
    //here we don't need to access the database again, we will just copy the previous list
      try{
          for(String model:this.models){
              modelsCopy.add(model);
          }
          samsungCopy=new Samsung(modelsCopy); 
          return samsungCopy;
      }
      catch(Exception e){
          return null;
      }
}

}

主程序:

  public static void main(String[] args) {
        Samsung usa_Samsung=new Samsung();
        Samsung morocco_Samsung=usa_Samsung.clone(); 
        System.out.println("original = " + usa_Samsung);
        System.out.println("copy = " + morocco_Samsung);
    }

输出:

original = Samsung@6d06d69c

copy = Samsung@7852e922

就像你看到的,这些对象由于不同而没有相同的地址。

注意!我只是举例使用了“三星”这个名称。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接