首页 > 编程语言 >Java设计模式-原型模式

Java设计模式-原型模式

时间:2023-05-23 20:32:36浏览次数:36  
标签:Java String 对象 创建 模式 Book 原型 设计模式

原型模式

简介

原型模式是一种创建型设计模式,它允许在运行时通过复制现有对象来创建新对象,而不是通过构造函数创建。这个模式的核心思想是基于一个现有的对象克隆一个新的对象,这个过程对外部世界是透明的,就像对象从未被克隆过一样。

原型模式的一个关键优点是可以避免在创建对象时重复性地执行复杂的初始化操作,从而提高了程序的性能和可维护性。与其他创建型模式相比,原型模式的一个显著特点是允许使用原型对象来生成多个具有不同状态的克隆对象。

与工厂模式相比,原型模式不需要创建具体的工厂类来创建新的对象,而是通过复制一个现有对象来生成新的对象。与建造者模式相比,原型模式不需要分步骤创建一个对象,而是通过克隆现有对象来生成新的对象。

实现

假设我们有一个名为Book的类,它包含了书的基本属性,如书名、作者和出版商。我们想要使用原型模式来复制这个类的对象,以便可以在程序中动态地创建多个不同状态的Book对象。我们可以先创建一个原型对象,然后使用该原型对象的克隆方法来创建新的对象。

下面是Book类的代码实现:

public class Book implements Cloneable {
    private String title;
    private String author;
    private String publisher;

    public Book(String title, String author, String publisher) {
        this.title = title;
        this.author = author;
        this.publisher = publisher;
    }

    public String getTitle() {
        return title;
    }

    public String getAuthor() {
        return author;
    }

    public String getPublisher() {
        return publisher;
    }

    public Book clone() {
        try {
            return (Book) super.clone();
        } catch (CloneNotSupportedException e) {
            return null;
        }
    }
}


我们在Book类中实现了Cloneable接口,这是使用原型模式必须的步骤。Book类包含了三个属性:titleauthorpublisher,以及一个clone方法。clone方法使用Java提供的Object.clone方法来复制一个新的Book对象。

下面是在Java中使用原型模式创建新的Book对象的示例代码:

public class PrototypeDemo {
    public static void main(String[] args) {
        Book prototype = new Book("Design Patterns", "Erich Gamma, Richard Helm, Ralph Johnson, 
                                  "John Vlissides","Addison-Wesley Professional");
	Book book1 = prototype.clone();
	book1.setTitle("Head First Design Patterns");
	System.out.println("Book 1: " + book1.getTitle() + " by " + book1.getAuthor() +
                       " (published by " + book1.getPublisher() + ")");
	Book book2 = prototype.clone();
	book2.setAuthor("Joshua Bloch");
	System.out.println("Book 2: " + book2.getTitle() + " by " + book2.getAuthor() + 
                       " (published by " + book2.getPublisher() + 	")");
	}
}

在这个示例中,我们首先创建一个原型对象prototype,然后使用该对象的clone方法来创建两个新的Book对象。我们分别修改了这两个对象的属性,以展示它们具有不同的状态。最后,我们输出了这两个对象的属性值。

原型模式的优缺点

优点

  1. 通过原型模式,我们可以避免创建复杂对象时的开销。
  2. 原型模式提供了一种更加灵活的方式来创建新对象。
  3. 原型模式能够保护现有对象的状态。

缺点

  1. 在实现原型模式时,必须注意克隆对象的所有属性,包括私有属性和引用类型属性。
  2. 如果原型对象的属性包含大量数据,那么复制对象的成本将会很高。
  3. 需要实现Cloneable接口,并且需要重写clone方法,这会增加代码量和复杂度。
  4. 克隆对象时需要注意深浅拷贝的问题,以免出现意料之外的错误。

总结

原型模式是一种用于对象复制的设计模式。它通过复制现有对象来创建新的对象,从而降低了对象创建成本。虽然原型模式有一些缺点,例如必须复制对象的所有属性和克隆大量数据的成本,但是它仍然是一个有用的设计模式,特别是在需要创建相似对象或保护现有对象状态的场景中。

标签:Java,String,对象,创建,模式,Book,原型,设计模式
From: https://blog.51cto.com/u_10217684/6334395

相关文章

  • Java核心之多态
    多态解析:最早学一个变量------>内存空间(小容器) 只有一个后来学一个数组------>内存空间(小容器) 存储一组一样的数据类型 好处是在于堆内存中存储的地址连续 便于循环遍历 数组创建时必须指定长度  频繁的添加或删除元素 个数固定就很不方便再后来学习如何描述类---......
  • [Java]instanceof和getClass()的区别
    getClass()willbeusefulwhenyouwanttomakesureyourinstanceisNOTasubclassoftheclassyouarecomparingwith. classA{}classBextendsA{}Objecto1=newA();Objecto2=newB();o1instanceofA=>trueo1instanceofB=>false......
  • 原型设计工具——Sketch
    Sketch是一款适用于所有设计师的矢量绘图应用。矢量绘图也是目前进行网页,图标以及界面设计的最好方式。但除了矢量编辑的功能之外,还添加了一些基本的位图工具,比如模糊和色彩校正。有经验的设计师花上几个小时便能将自己的设计技巧在Sketch中自如运用。对于绝大多数的数字产品设计......
  • java api调用kafka
    已经启用了zookeeper和kafka单机的ip为192.168.80.128加入maven的pom.xml代码如下 <dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-clients</artifactId><version>0.8.2.1</version&g......
  • Java图像二值化,并裁去白边
    手写签名场景,为更符合签名效果,节省服务器存储空间,将原图二值化后,再将多于空白去裁去。java中图像二值化有个小技巧,能够很方便将图像二值化,不用再重费心思去研究二值化过程,技巧在这个参数BufferedImage.TYPE_BYTE_BINARY 1packagecom.test;23importjava.awt.Color;......
  • 【Java Web】MultipartFile和byte[]互转
    接口接收文件@RequestParam("file")MultipartFilefileMultipartFile转byte[]Stringname=file.getName();StringoriginalFilename=file.getOriginalFilename();StringcontentType=file.getContentType();Stringbytes=file.getBytes();byte[]转Multipar......
  • javascript中的错误类型
    javascript中的错误类型:SyntaxErrorTypeErrorReferenceErrorRangeErrorURLErrorErrorSyntaxError语法错误//当您在编写一个函数时忘记了括号,)来括起您的代码,您将收到一个SyntaxError错误functionsay(text){returntext;}say('shark';//outputUncaug......
  • java.sql.SQLException: Access denied for user 'root'@'localhost' (using password
    org.apache.ibatis.exceptions.PersistenceException:###Errorqueryingdatabase.Cause:java.sql.SQLException:Accessdeniedforuser'root'@'localhost'(usingpassword:YES)###Theerrormayexistincom/itheima/mapper/BrandMapper.j......
  • org.springframework.data.annotation.Transient 和 javax.persistence.Transient 的
    1、org.springframework.data.annotation.Transient 和 javax.persistence.Transient 都是用于标记一个属性不需要被持久化到数据库中的注解。它们的区别在于它们所处的框架和使用场景。org.springframework.data.annotation.Transient 是SpringDataJPA框架提供的注解,用......
  • java入门
    java简介:1.什么是程序:程序通常指完成某些事情的一种既定方式和过程;(方式){细节1;细节2;细节3}(过程){第一步;第二步;第三步}2.java的产生:1995年诞生。java之父高斯林3.java的发展史:java诞生于1995年。java目前在企业开发过程中,使用和占有率最高的是jdk1.84.java的技术平台:java技术平......