微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

JAVA设计模式---原型模式你了解吗

这篇文章主要介绍了JAVA 原型模式的的相关资料,文中讲解非常细致,实例帮助大家更好的理解和学习,感兴趣的朋友可以了解下

目录

介绍

角色

Java语言提供的clone()方法

代码演示―克隆羊

结论

深浅拷贝

深浅拷贝探讨

实现深克隆的方式一 : 手动对引用对象进行克隆

实现深克隆的方式二 :序列化

原型模式对单例模式的破坏

优缺点

原型模式在Spring中的应用场景

总结

介绍

原型模式(Prototype Pattern):使用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式是一种对象创建型模式。

原型模式的工作原理很简单:将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝自己来实现创建过程。

原型模式是一种“另类”的创建型模式,创建克隆对象的工厂就是原型类自身,工厂方法由克隆方法来实现。

需要注意的是通过克隆方法所创建的对象是全新的对象,它们在内存中拥有新的地址,通常对克隆所产生的对象进行修改对原型对象不会造成任何影响,每一个克隆对象都是相互独立的。通过不同的方式修改可以得到一系列相似但不完全相同的对象。

角色

Prototype(抽象原型类):它是声明克隆方法的接口,是所有具体原型类的公共父类,可以是抽象类也可以是接口,甚至还可以是具体实现类。

ConcretePrototype(具体原型类):它实现在抽象原型类中声明的克隆方法,在克隆方法中返回自己的一个克隆对象。

Client(客户类):让一个原型对象克隆自身从而创建一个新的对象,在客户类中只需要直接实例化或通过工厂方法等方式创建一个原型对象,再通过调用该对象的克隆方法即可得到多个相同的对象。由于客户类针对抽象原型类Prototype编程,因此用户可以根据需要选择具体原型类,系统具有较好的可扩展性,增加或更换具体原型类都很方便。

原型模式的核心在于如何实现克隆方法

Java语言提供的clone()方法

学过Java语言的人都知道,所有的java类都继承自 java.lang.Object。事实上,Object 类提供一个 clone() 方法,可以将一个Java对象复制一份。因此在Java中可以直接使用 Object 提供的 clone() 方法来实现对象的克隆,Java语言中的原型模式实现很简单。

需要注意的是能够实现克隆的java类必须实现一个 标识接口 Cloneable,表示这个java类支持被复制。如果一个类没有实现这个接口但是调用了clone()方法,Java编译器将抛出一个 CloneNotSupportedException 异常。

代码演示―克隆羊

具体原型类:

//实现Cloneable接口 @Data public class Sheep implements Cloneable { private String name; private Integer age; //重写Object的clone方法 @Override protected Object clone() throws CloneNotSupportedException { Sheep sheep=null; sheep=(Sheep)super.clone(); return sheep; } }

客户端创建并克隆原型对象:

//创建原型对象 Sheep sheep=new Sheep(); sheep.setAge(3); sheep.setName("肖恩"); //克隆 Sheep sheep1 = sheep.clone(); Sheep sheep2=sheep.clone(); System.out.println(sheep1); System.out.println(sheep2); System.out.println(sheep1==sheep2);

结论

克隆出来的对象,它们的内存地址均不同,说明不是同一个对象,克隆成功,克隆仅仅通过调用 super.clone() 即可。

看一眼 Object#clone 方法

protected native Object clone() throws CloneNotSupportedException;

这是一个 native 关键字修饰的方法

一般而言,Java语言中的clone()方法满足:

对任何对象x,都有 x.clone() != x,即克隆对象与原型对象不是同一个对象;

对任何对象x,都有 x.clone().getClass() == x.getClass(),即克隆对象与原型对象的类型一样;

如果对象x的 equals() 方法定义恰当,那么 x.clone().equals(x) 应该成立。

为了获取对象的一份拷贝,我们可以直接利用Object类的clone()方法,具体步骤如下:

在派生类中覆盖基类的 clone() 方法,并声明为public;

在派生类的 clone() 方法中,调用 super.clone();

派生类需实现Cloneable接口。

此时,Object类相当于抽象原型类,所有实现了Cloneable接口的类相当于具体原型类。

深浅拷贝

pig类:

@Data @AllArgsConstructor @NoArgsConstructor public class Pig { String name; Integer age; }

sheep类:

//实现Cloneable接口 @Data public class Sheep implements Cloneable { private String name; private Integer age; private Pig pig; //重写Object的clone方法 @Override protected Sheep clone() throws CloneNotSupportedException { Sheep sheep=null; sheep=(Sheep)super.clone(); return sheep; } }

客户端进行克隆:

public class test { @Test public void test() throws CloneNotSupportedException { //创建原型对象 Sheep sheep=new Sheep(); sheep.setAge(3); sheep.setName("肖恩"); sheep.setPig(new Pig("大忽悠",3)); //克隆 Sheep sheep1 = sheep.clone(); Sheep sheep2=sheep.clone(); System.out.println(sheep1); System.out.println(sheep2); System.out.println(sheep1==sheep2); System.out.println("=============================="); System.out.println(sheep1.getPig()==sheep2.getPig()); } }

这里对Sheep类里面的引用类型Pig的克隆方式只是简单的地址拷贝,即浅拷贝操作

上一篇:Java中从键盘输入多个整数的方法下一篇:浅谈JAVASE单例设计模式

热门搜索

原型设计模式 

原型模式 

模式设计 

设计模式 

模版设计模式 

相关文章

JAVA设计模式---原型模式你了解吗

2021-09-10阅读(5428)评论(0)推荐()

这篇文章主要介绍了JAVA 原型模式的的相关资料,文中讲解非常细致,实例帮助大家更好的理解和学习,感兴趣的朋友可以了解下

Java设计模式之原型模式(Prototype模式)介绍

2021-10-12阅读(5179)评论(0)推荐()

这篇文章主要介绍了Java设计模式之原型模式(Prototype模式)介绍,本文讲解了如何使用原型模式并给出了代码实例,需要的朋友可以参考下

Java设计模式之java原型模式详解

2021-09-28阅读(4414)评论(0)推荐()

这篇文章主要介绍了Java设计模式之原型模式详解,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下

Java设计模式之原型模式详解

2021-09-10阅读(2955)评论(0)推荐()

这篇文章主要介绍了Java设计模式之原型模式详解,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下

java设计模式--原型模式详解

2021-11-15阅读(10420)评论(0)推荐()

这篇文章主要为大家详细介绍了Java设计模式之Prototype原型模式的相关资料,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

C++设计模式之原型模式

2021-10-06阅读(9102)评论(0)推荐()

这篇文章主要介绍了C++设计模式之原型模式,本文讲解了什么是原型模式、为什么要使用原型模式、代码实例等内容,需要的朋友可以参考下

PHP设计模式之原型设计模式原理与用法分析

2021-09-14阅读(4628)评论(0)推荐()

这篇文章主要介绍了PHP设计模式之原型设计模式,简单描述了原型设计模式的概念、原理并结合实例形式分析了PHP原型设计模式的定义与使用方法,需要的朋友可以参考下

取消

有人回复邮件通知

提交评论

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐