作者 | Java圣斗士 | 原创图文 ,转载请注明出处
全文1000字,阅读需要5分钟

哈喽,大家好,我是又皮又可爱的Java圣斗士,关注我,每天带你飞!
今天我们来聊一聊原型模式。
原型模式应该算是比较简单的一种设计模式,其实一个词就可以概括,那就是——克隆对象!
我们经常在各种影视作品中看到“克隆”这个科技元素,是不是十分带感呢?我记得小时候最令我震撼的克隆电影就是州长的《第六日》,里面讲述了一个......
咳咳咳,跑题了,总之这个电影挺不错的,建议大家可以找来看看。

原型模式的克隆对象是什么意思呢?没错,其实和克隆人一样,将对象进行一种克隆,节约创建对象所产生的开支。
那有的小伙伴要问了,为什么要克隆对象,直接 new 来创建对象不就OK了?
这里就需要引出原型模式的应用场景。
在实际生产中,往往会出现这样的应用场景。需要创建一定数目的某种对象,但是手工new的话可能不太方便,那么我们就可以使用这种原型模式来进行对象的创建,省去了对象属性的赋值,因为在使用原型模式的时候就已经将全部属性进行了拷贝。

原型模式的实现过程非常简单。首先,我们需要让希望能够拷贝的类实现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()方法即可,完全免去了手动创建再赋值的繁琐操作。是不是很神奇?
你学会了吗?

往期精彩:
《对话式情景剖析,String被final修饰的真正原因!一篇足矣》
---欢迎关注【Java圣斗士】,我是你们的小可爱(✪ω✪) Morty---
---专注IT职场经验、IT技术分享的灵魂写手---
---每天带你领略IT的魅力---
---期待与您陪伴!---
| 留言与评论(共有 0 条评论) |