作者 | Java圣斗士 | 原创图文 ,转载请注明出处

全文1000字,阅读需要5分钟

原型  模式(克隆就在我们身边)(1)

哈喽,大家好,我是又皮又可爱的Java圣斗士,关注我,每天带你飞!

今天我们来聊一聊原型模式

原型模式应该算是比较简单的一种设计模式,其实一个词就可以概括,那就是——克隆对象!

我们经常在各种影视作品中看到“克隆”这个科技元素,是不是十分带感呢?我记得小时候最令我震撼的克隆电影就是州长的《第六日》,里面讲述了一个......

咳咳咳,跑题了,总之这个电影挺不错的,建议大家可以找来看看。

原型  模式(克隆就在我们身边)(2)

一、克隆其实很简单

原型模式的克隆对象是什么意思呢?没错,其实和克隆人一样,将对象进行一种克隆,节约创建对象所产生的开支。

那有的小伙伴要问了,为什么要克隆对象,直接 new 来创建对象不就OK了?

这里就需要引出原型模式的应用场景。

在实际生产中,往往会出现这样的应用场景。需要创建一定数目的某种对象,但是手工new的话可能不太方便,那么我们就可以使用这种原型模式来进行对象的创建,省去了对象属性的赋值,因为在使用原型模式的时候就已经将全部属性进行了拷贝。

原型  模式(克隆就在我们身边)(3)

二、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()方法即可,完全免去了手动创建再赋值的繁琐操作。是不是很神奇?

你学会了吗?

原型  模式(克隆就在我们身边)(4)

往期精彩:

《必考!Java参数传递的真正秘密》

《情景对话,一篇带你参悟工厂模式》

《情景对话,一篇带你参悟单例模式》

《对话式情景剖析,String被final修饰的真正原因!一篇足矣》

《线程池?不懂也会被问到的任务执行器》

---欢迎关注【Java圣斗士】,我是你们的小可爱(✪ω✪) Morty---

---专注IT职场经验、IT技术分享的灵魂写手---

---每天带你领略IT的魅力---

---期待与您陪伴!---

,