设计模式三(原型模式)

这篇具有很好参考价值的文章主要介绍了设计模式三(原型模式)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在开发过程中,创建多个数据相同的对象,每次new都开销比较大,在这里可以使用对象克隆,以先创建的原型对象为模板进行对象的复制。这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用

浅克隆

在浅克隆中,如果原型对象的成员变量是值类型,将复制一份给克隆对象;如果原型对象的成员变量是引用类型,则将引用对象的地址复制一份给克隆对象,也就是说原型对象和克隆对象的成员变量指向相同的内存地址

 
public class Person implements  Cloneable{
 ​
      int num;
      String name;
 ​
     public Person() {
     }
 ​
     public Person(int num, String name) {
         this.num = num;
         this.name = name;
     }
 ​
     public int getNum() {
         return num;
     }
 ​
     public void setNum(int num) {
         this.num = num;
     }
 ​
     public String getName() {
         return name;
     }
 ​
     public void setName(String name) {
         this.name = name;
     }
 ​
 ​
 ​
     @Override
     protected Person clone() throws CloneNotSupportedException {
         Person person = (Person)super.clone();
         return person;
     }
 ​
     @Override
     public String toString() {
         return "Person{" +
                 "num=" + num +
                 ", name='" + name + '\'' +
                 '}';
     }
 }
 public class Test {
 ​
     public static void main(String[] args) throws CloneNotSupportedException {
 ​
         Person p1 = new Person(100,"jim");
         Person p2 =p1.clone();//clone方法 返回一个新对象
         p2.name = "tom";
         System.out.println(p1);//100 ,jim
         System.out.println(p2);//100 tom
 ​
         System.out.println(p1==p2);//false
 ​
     }
 }

深克隆

多层克隆

在深克隆中,无论原型对象的成员变量是值类型还是引用类型,都将复制一份给克隆对象,深克隆将原型对象的所有引用对象也复制一份给克隆对象。简单来说,在深克隆中,除了对象本身被复制外,对象所包含的所有成员变量也将复制

 public class Person implements  Cloneable{
 ​
      int num;
      String name;
      Address address;
 ​
     public Person() {
 ​
     }
 ​
     public Person(int num, String name) {
         this.num = num;
         this.name = name;
     }
 ​
     public int getNum() {
         return num;
     }
 ​
     public void setNum(int num) {
         this.num = num;
     }
 ​
     public String getName() {
         return name;
     }
 ​
     public void setName(String name) {
         this.name = name;
     }
 ​
     public Address getAddress() {
         return address;
     }
 ​
     public void setAddress(Address address) {
         this.address = address;
     }
 ​
     @Override
     protected Person clone() throws CloneNotSupportedException {
         Person person = (Person)super.clone();
         person.address = address.clone();   //深度复制  联同person中关联的对象也一同克隆.
         return person;
     }
 ​
     @Override
     public String toString() {
         return "Person{" +
                 "num=" + num +
                 ", name='" + name + '\'' +
                 ", address=" + address +
                 '}';
     }
 }
 ​
 public class Address  implements Cloneable{
 ​
      String  address;
 ​
     public String getAddress() {
         return address;
     }
 ​
     public void setAddress(String address) {
         this.address = address;
     }
 ​
     @Override
     public String toString() {
         return "Address{" +
                 "address='" + address + '\'' +
                 '}';
     }
 ​
      @Override
     protected Address clone() throws CloneNotSupportedException {
         return (Address) super.clone();
     }
 }

序列化

 
public class Address  implements Serializable {
 ​
      String  address;
 ​
     public String getAddress() {
         return address;
     }
 ​
     public void setAddress(String address) {
         this.address = address;
     }
 ​
     @Override
     public String toString() {
         return "Address{" +
                 "address='" + address + '\'' +
                 '}';
     }
 ​
 }
 
public class Person implements Serializable {
 ​
      int num;
      String name;
      Address address;
 ​
     public Person() {
     }
 ​
     public Person(int num, String name) {
         this.num = num;
         this.name = name;
     }
 ​
     public int getNum() {
         return num;
     }
 ​
     public void setNum(int num) {
         this.num = num;
     }
 ​
     public String getName() {
         return name;
     }
 ​
     public void setName(String name) {
         this.name = name;
     }
 ​
     public Address getAddress() {
         return address;
     }
 ​
     public void setAddress(Address address) {
         this.address = address;
     }
 ​
     /**
      * 自定义克隆方法
      * @return
      */
     public Person myclone() {
             Person person = null;
               try { // 将该对象序列化成流,因为写在流里的是对象的一个拷贝,而原对象仍然存在于JVM里面。所以利用这个特性可以实现对象的深拷贝
                      ByteArrayOutputStream baos = new ByteArrayOutputStream();
                       ObjectOutputStream oos = new ObjectOutputStream(baos);
                       oos.writeObject(this);
             // 将流序列化成对象
                     ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
                      ObjectInputStream ois = new ObjectInputStream(bais);
                      person = (Person) ois.readObject();
                   } catch (IOException e) {
                      e.printStackTrace();
                   } catch (ClassNotFoundException e) {
                      e.printStackTrace();
                  }
              return person;
           }
 ​
 ​
     @Override
     public String toString() {
         return "Person{" +
                 "num=" + num +
                 ", name='" + name + '\'' +
                 ", address=" + address +
                 '}';
     }
 }

 练习

题目页面 (kamacoder.com)文章来源地址https://www.toymoban.com/news/detail-824355.html

import java.util.Scanner;

public class Main {

    public static void main(String[] args) throws CloneNotSupportedException {
        Scanner scanner = new Scanner(System.in);
        int num = scanner.nextInt();
        while(num-->0){
            String color = scanner.next();
            int width = scanner.nextInt();
            int height = scanner.nextInt();
            Prototype prototype = new Prototype(color, width, height);
            Prototype clone = prototype.clone();
            System.out.println(clone.toString());
        }
    }
}

class Prototype implements Cloneable{
    private String color;
    private int width;
    private int height;

    public Prototype(String color, int width, int height) {
        this.color = color;
        this.width = width;
        this.height = height;
    }

    @Override
    public String toString() {
        return "Color: " + color + ", Width: " + width + ", Height: " + height;
    }

    @Override
    protected Prototype clone() throws CloneNotSupportedException {
        return (Prototype) super.clone();
    }


}

到了这里,关于设计模式三(原型模式)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java设计模式-原型模式(3)

         馆长准备了很多学习资料,其中包含 java方面,jvm调优,spring / spring boot /spring cloud ,微服务,分布式,前端,js书籍资料,视频资料,以及各类常用软件工具,破解工具 等资源。请关注“IT技术馆”公众号,进行关注,馆长会每天更新资源和更新技术文章等。请大家多

    2024年01月21日
    浏览(43)
  • Java原型设计模式

    Java原型模式(Prototype Pattern)是一种创建型设计模式,它允许通过复制现有对象来创建新的对象,而无需显式地指定它们的类。这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个

    2024年02月13日
    浏览(39)
  • 《Java极简设计模式》第05章:原型模式(Prototype)

    作者:冰河 星球:http://m6z.cn/6aeFbs 博客:https://binghe.gitcode.host 文章汇总:https://binghe.gitcode.host/md/all/all.html 源码地址:https://github.com/binghe001/java-simple-design-patterns/tree/master/java-simple-design-prototype 沉淀,成长,突破,帮助他人,成就自我。 本章难度:★★☆☆☆ 本章重点:用

    2024年02月11日
    浏览(43)
  • Java设计模式之创建型-原型模式(UML类图+案例分析)

    目录 一、基础概念 二、UML类图 三、角色设计 四、案例分析  4.1、通用实现(浅克隆) 4.2、深克隆 五、总结 原型模式通过复制已有对象作为原型,通过复制该原型来返回一个新对象,而不是新建对象,说白了就是不断复制相同的对象罢了。 角色 描述 抽象原型类 规定了具

    2024年02月15日
    浏览(49)
  • 【java设计模式】创建型模式介绍(工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式)

    简介 本文介绍Java设计模式中创建型模式的五种 一、工厂模式 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 工厂模式提供了一种将对象的实例化过程封装在工厂类中的方式。通过使用工

    2024年02月16日
    浏览(47)
  • [设计模式Java实现附plantuml源码~创建型] 对象的克隆~原型模式

    前言: 为什么之前写过Golang 版的设计模式,还在重新写 Java 版? 答:因为对于我而言,当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言,更适合用于学习设计模式。 为什么类图要附上uml 因为很多人学习有做笔记的习惯,如果单纯的只是放一张图片,那

    2024年01月23日
    浏览(41)
  • 【设计模式——学习笔记】23种设计模式——原型模式Prototype(原理讲解+应用场景介绍+案例介绍+Java代码实现)

    原型模式指用通过拷贝原型实例创建新的实例,新实例和原型实例的属性完全一致 原型模式是一种创建型设计模式 工作原理是通过调用原型实例的 clone() 方法来完成克隆,原型实例需要实现Cloneable接口,并重写 clone() 方法 需要为每个类开发一个克隆方法,这对全新的类来说

    2024年02月16日
    浏览(52)
  • 【原型设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

    原型模式(Prototype Pattern)是一种创建型设计模式,使你能够复制已有对象,而无需使代码依赖它们所属的类,同时又能保证性能。 这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。 如果你需要复制一些对

    2023年04月24日
    浏览(84)
  • 二十三种设计模式全面解析-原型模式进阶之原型管理器:集中管理对象原型的设计模式之道

    在软件开发中,我们经常需要创建和复制对象。然而,有时候直接创建对象可能会导致性能下降或代码重复。为了解决这些问题,原型模式应运而生。而使用原型管理器(Prototype Manager)来集中管理原型对象可以进一步提高灵活性和可维护性。本文将详细介绍原型管理器的用

    2024年02月07日
    浏览(57)
  • 设计模式-原型模式详解

    简介设计模式 设计模式是在软件开发中常见问题的解决方案,它们是经过实践和经验总结出来的可重用的设计思想和解决方案。设计模式通过提供通用的架构、原则和指导,帮助开发人员更有效地编写高质量的代码。 设计模式分为三个主要类别: 创建型模式:关注对象的创

    2024年02月10日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包