一、简介
1.定义
一种创建型设计模式,它通过复制一个已经存在的实例来返回新的实例,而不是新建实例,其中被复制的实例就是我们所称的原型。
原型模式的本质:克隆生成对象。
2.什么时候用?
- 使用原型模式创建对象比直接new一个对象在性能上要好的多,因为Object类的clone方法是一个本地方法,它直接操作内存中的二进制流,特别是复制大对象时,性能的差别非常明显。
- 使用原型模式的另一个好处是简化对象的创建,使得创建对象就像我们在编辑文档时的复制粘贴一样简单。
因为以上优点,所以在需要重复地创建相似对象时可以考虑使用原型模式。比如需要在一个循环体内创建对象,假如对象创建过程比较复杂或者循环次数很多的话,使用原型模式不但可以简化创建过程,而且可以使系统的整体性能提高很多。
二、原型模式在Java中的应用
1.Cloneable接口
Java中,我们可以通过实现java.lang.Cloneable接口来实现原型模式。
需要注意的是这里是直接在内存中复制收据,不会调用类的构造方法,而且会破坏单例模式。
2.浅度克隆:
仅仅是值克隆,即原型对象和克隆对象属性的值一样,对于引用类型指向的是同一个对象
3.深度克隆:
值克隆+引用对象的克隆,即引用对象也会进行克隆获得新的对象给对应属性。
4.简单实例
注意:Book中的clone()方法“rtn.setAuthor((Author) this.getAuthor().clone());”如果没有这句,仅仅是浅度克隆,原型对象和克隆对象引用的是同一个Author对象,而这句就是为了实现深度克隆。
public class Author implements Cloneable { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } }
public class Book implements Cloneable { private String name; private int pageNum; private Author author; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getPageNum() { return pageNum; } public void setPageNum(int pageNum) { this.pageNum = pageNum; } public Author getAuthor() { return author; } public void setAuthor(Author author) { this.author = author; } @Override public Object clone() throws CloneNotSupportedException { Book rtn = (Book) super.clone(); rtn.setAuthor((Author) this.getAuthor().clone()); return rtn; } }
public class PrototypeTest { public static void main(String[] args) throws Exception { Author author = new Author(); author.setName("金庸"); author.setAge(65); Book book = new Book(); book.setName("射雕英雄传"); book.setPageNum(230); book.setAuthor(author); Book newBook = (Book) book.clone(); System.out.println(newBook == book); System.out.println(newBook.getAuthor() == book.getAuthor()); } }
相关推荐
此外,为了确保参考资料的权威性,建议读者查阅原书《Java设计模式》以获得更加详尽的解释和说明。如果有任何意见或建议,可以通过提供的电子邮箱与作者联系。在学习设计模式的过程中,理解每一个模式的意图、结构、...
《Java设计模式》是刘伟教授的一本关于设计模式的教材,主要面向高等学校的学生和对Java编程有深入兴趣的开发者。设计模式是软件工程中的一种重要思想,它封装了在特定场景下的问题解决方案,可以提高代码的可读性、...
Java设计模式是软件工程中的一种最佳实践,它总结了在特定场景下解决常见问题的经验,为程序员提供了可重用的解决方案。本资料“《java设计模式》课后习题模拟试题解答——刘伟.zip”主要涵盖了Java设计模式的学习与...
《java设计模式(第2版)》通过一个完整的java项目对经典著作design patterns一书介绍的23种设计模式进行了深入分析与讲解,实践性强,却又不失对模式本质的探讨。本书创造性地将这些模式分为5大类别,以充分展现各个...
### 韩顺平_Java设计模式笔记知识点详解 #### 1. Java设计模式内容介绍 ##### 1.1.1 先看几个经典的面试题 - **原型设计模式问题** - **UML类图**:原型模式的核心在于定义了一个`Prototype`接口,该接口声明了...
第9章 原型模式(Prototype) 第10章 中介者模式(Mediator) 第11章 代理模式(Proxy) 第12章 观察者模式(Observer) 第13章 命令模式(Command) 第14章 迭代器模式(Iterator) 第15章 组合模式(Composite) ...
第9章 原型模式(Prototype) 第10章 中介者模式(Mediator) 第11章 代理模式(Proxy) 第12章 观察者模式(Observer) 第13章 命令模式(Command) 第14章 迭代器模式(Iterator) 第15章 组合模式(Composite) ...
第9章 原型模式(Prototype) 第10章 中介者模式(Mediator) 第11章 代理模式(Proxy) 第12章 观察者模式(Observer) 第13章 命令模式(Command) 第14章 迭代器模式(Iterator) 第15章 组合模式(Composite) ...
本书的第一章主要介绍了设计模式的概念和价值,阐述了为何在面向对象设计中需要使用设计模式,以及它们如何帮助我们创建可维护和可扩展的软件系统。 第二章至第五章,作者们详细讲解了五种创建型设计模式:单例模式...
### 24种Java设计模式介绍与6大设计原则 #### 第1章 策略模式(Strategy Pattern) 策略模式是一种行为型设计模式,它定义了一系列的算法,并将每一个算法封装起来,使得它们可以互相替换。策略模式让算法的变化...
3.4 Prototype(原型)—对象创建型 模式 87 3.5 Singleton(单件)—对象创建型 模式 84 3.6 创建型模式的讨论 89 第4章 结构型模式 91 4.1 Adapter(适配器)—类对象结构型 模式 92 4.2 Bridge(桥接)—...
3.4 Prototype(原型)—对象创建型 模式 87 3.5 Singleton(单件)—对象创建型 模式 84 3.6 创建型模式的讨论 89 第4章 结构型模式 91 4.1 Adapter(适配器)—类对象结构型 模式 92 4.2 Bridge(桥接)—对象结构...
在Java设计模式中,有三大类模式:创建型模式(Creational Patterns)、结构型模式(Structural Patterns)和行为型模式(Behavioral Patterns)。创建型模式如单例(Singleton)、工厂方法(Factory Method)、抽象...
JavaScript设计模式中的继承机制是其面向对象编程的重要组成部分。继承允许子类继承父类的属性和方法,从而减少代码重复并提高代码复用性。在JavaScript中,继承并不像Java或C++等语言那样简单地使用一个关键字,...
### 第一章:创建型模式 #### 1.1 工厂模式(Factory) 工厂模式是一种用于创建对象的接口,但允许子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。 #### 1.2 抽象工厂模式(Abstract Factory) ...
1. **第一章:JavaScript简介** - JavaScript的历史和背景 - JavaScript与Java的区别 - JavaScript在浏览器中的执行环境:DOM(Document Object Model)和BOM(Browser Object Model) - JavaScript的基本语法:...