服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - Java设计模式-原型模式

Java设计模式-原型模式

2023-05-08 01:01未知服务器之家 Java教程

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

Java设计模式-原型模式

简介

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

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

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

实现

假设我们有一个名为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教程浅谈java IO流——四大抽象类

    浅谈java IO流——四大抽象类

    这篇文章主要介绍了java IO流——四大抽象类,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着...

    唯有一片炙热12412021-07-20
  • Java教程java 实现约瑟夫环的实例代码

    java 实现约瑟夫环的实例代码

    这一次是借鉴模仿别人写的代码,以前觉得不好将数据结构的链结构什么的迁移到java上来使用,但这一次确实让我感受到了可以自己构造数据结构,然后使...

    java代码网4112019-10-15
  • Java教程springboot注入yml配置文件 list报错的解决方案

    springboot注入yml配置文件 list报错的解决方案

    这篇文章主要介绍了springboot注入yml配置文件 list报错的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...

    风舞叶扬8452021-11-24
  • Java教程SSM项目中使用拦截器和过滤器的实现示例

    SSM项目中使用拦截器和过滤器的实现示例

    这篇文章主要介绍了SSM项目中使用拦截器和过滤器的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要...

    别团等shy哥发育10042021-09-09
  • Java教程老生常谈比较排序之堆排序

    老生常谈比较排序之堆排序

    下面小编就为大家带来一篇老生常谈比较排序之堆排序。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    Java教程网5362020-11-23
  • Java教程浅析Java中Runnable和Thread的区别

    浅析Java中Runnable和Thread的区别

    在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口;Thread类是在java.lang包中定义的。接下来通过本文给大家浅析Java中Runnable和...

    孙佳敏5042020-08-10
  • Java教程SpringBoot 开发提速神器 Lombok+MybatisPlus+SwaggerUI

    SpringBoot 开发提速神器 Lombok+MybatisPlus+SwaggerUI

    这篇文章主要介绍了SpringBoot 开发提速神器 Lombok+MybatisPlus+SwaggerUI,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友...

    陈彦斌6892021-08-21
  • Java教程浅谈hibernate之映射文件VS映射注解

    浅谈hibernate之映射文件VS映射注解

    下面小编就为大家带来一篇浅谈hibernate之映射文件VS映射注解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    Java教程网2112020-12-04