原型模式的应用场景(克隆就在我们身边)
原型模式的应用场景(克隆就在我们身边)那有的小伙伴要问了,为什么要克隆对象,直接 new 来创建对象不就OK了?原型模式的克隆对象是什么意思呢?没错,其实和克隆人一样,将对象进行一种克隆,节约创建对象所产生的开支。原型模式应该算是比较简单的一种设计模式,其实一个词就可以概括,那就是——克隆对象!我们经常在各种影视作品中看到“克隆”这个科技元素,是不是十分带感呢?我记得小时候最令我震撼的克隆电影就是州长的《第六日》,里面讲述了一个......咳咳咳,跑题了,总之这个电影挺不错的,建议大家可以找来看看。
作者 | Java圣斗士 | 原创图文 ,转载请注明出处
全文1000字,阅读需要5分钟
哈喽,大家好,我是又皮又可爱的Java圣斗士,关注我,每天带你飞!
今天我们来聊一聊原型模式。
原型模式应该算是比较简单的一种设计模式,其实一个词就可以概括,那就是——克隆对象!
我们经常在各种影视作品中看到“克隆”这个科技元素,是不是十分带感呢?我记得小时候最令我震撼的克隆电影就是州长的《第六日》,里面讲述了一个......
咳咳咳,跑题了,总之这个电影挺不错的,建议大家可以找来看看。
一、克隆其实很简单原型模式的克隆对象是什么意思呢?没错,其实和克隆人一样,将对象进行一种克隆,节约创建对象所产生的开支。
那有的小伙伴要问了,为什么要克隆对象,直接 new 来创建对象不就OK了?
这里就需要引出原型模式的应用场景。
在实际生产中,往往会出现这样的应用场景。需要创建一定数目的某种对象,但是手工new的话可能不太方便,那么我们就可以使用这种原型模式来进行对象的创建,省去了对象属性的赋值,因为在使用原型模式的时候就已经将全部属性进行了拷贝。
二、Let me show you code原型模式的实现过程非常简单。首先,我们需要让希望能够拷贝的类实现Cloneable接口:
public class MyEntry implements Cloneable {
这一步是必须的,Cloneable接口是一个标记接口,其内部没有任何抽象方法:
public interface Cloneable { }
这个接口只是为了表名当使用Object.clone()方法时是合法的,并且允许执行属性的拷贝。
为了能够体现普遍性,我们在MyEntry类中依赖一个Part对象,这个Part是一个引用类型,然后再在其内部依赖一个内部类:
public class Part { private String partName; private int score; private Inner inner = new Inner("inner" 123); private static class Inner { private String innerName; private int innerScore; public Inner(String innerName int innerScore) { this.innerName = innerName; this.innerScore = innerScore; } // getter、setter、toString... } public Part(String partName int score) { super(); this.partName = partName; this.score = score; } // getter、setter、toString... }
除了Part这个封装类型的对象,同时也为MyEntry附加两个属性:String 和 int:
public class MyEntry implements Cloneable { private String name; private int num; private Part part; public MyEntry(String name int num Part part) { this.name = name; this.num = num; this.part = part; } @Override protected Object clone() { try { return super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return null; } public void show() { System.out.println(this); } // getter、setter、toString... }
那么到这里,克隆模式的全部代码就已经完成了。当我们希望克隆这个对象的时候,可以像下面代码这样来使用:
public static void main(String[] args) { MyEntry con = new MyEntry("con" 23 new Part("part" 90)); con.show(); MyEntry clone = (MyEntry) con.clone(); clone.show(); System.out.println(con.getName() == clone.getName()); System.out.println(con.getNum() == clone.getNum()); System.out.println(con.getPart() == clone.getPart()); }
输出结果:
{name : con num : 23 part : {partName : part score : 90 inner : {innerName : inner innerScore : 123}}} {name : con num : 23 part : {partName : part score : 90 inner : {innerName : inner innerScore : 123}}} true true true
可以看到,两个对象的内部属性是完全一致的,就好像真的克隆出来了一份,而且,只需要调用clone()方法即可,完全免去了手动创建再赋值的繁琐操作。是不是很神奇?
你学会了吗?
往期精彩:
《必考!Java参数传递的真正秘密》
《情景对话,一篇带你参悟工厂模式》
《情景对话,一篇带你参悟单例模式》
《对话式情景剖析,String被final修饰的真正原因!一篇足矣》
《线程池?不懂也会被问到的任务执行器》
---欢迎关注【Java圣斗士】,我是你们的小可爱(✪ω✪) Morty---
---专注IT职场经验、IT技术分享的灵魂写手---
---每天带你领略IT的魅力---
---期待与您陪伴!---