原型模式(Prototype)

Prototype原型模式主要用于复制对象 ,将被复制的对象必须实现Cloneable接口。

 

对象复制分为:对象浅复制、对象深复制

例如Person对象

对象浅复制--- Person  对象内简单的属性复制

对象深复制--- Person 对象内不仅仅简单属性可以复制,引用属性Friend也可以一并复制出来。

 

代码例子如下:

 

 public class Person implements Cloneable { private String name; private int age; private String sex; private List<Friend> friends; public List<Friend> getFriends() { return friends; } public void setFriends(List<Friend> friends) { this.friends = friends; } 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; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } @Override protected Object clone() throws CloneNotSupportedException { Person person = (Person)super.clone(); List<Friend> newfriends=new ArrayList<Friend>(); for(Friend friend:this.getFriends()){ newfriends.add((Friend)friend.clone()); //深度克隆 } person.setFriends(newfriends); return person; } public static void main(String[] args) throws CloneNotSupportedException { Friend friend1 = new Friend(); friend1.setName("冯XX"); friend1.setAge(22); friend1.setSex("男"); Friend friend2 = new Friend(); friend2.setName("王XX"); friend2.setAge(21); friend2.setSex("女"); List<Friend> friends=new ArrayList<Friend>(); friends.add(friend1); friends.add(friend2); Person person1 = new Person(); person1.setName("大笨熊"); person1.setAge(23); person1.setSex("男"); person1.setFriends(friends); Person person2 = new Person(); person2=(Person) person1.clone(); System.out.println(person1.getName()); System.out.println("他有如下朋友:"); for(Friend friend:person1.getFriends()){ System.out.println(friend.getName()); } System.out.println("克隆的"+person2.getName()); System.out.println("他有如下克隆的朋友"); for(Friend friend:person2.getFriends()){ System.out.println(friend.getName()); } System.out.println("开始把克隆对象给更名,并且更新克隆对象的好友名称"); person2.setName("Csdn"); person2.getFriends().get(0).setName("李XX"); person2.getFriends().get(1).setName("刘XX"); System.out.println("更新结束"); System.out.println("深度克隆,更改克隆对象值,不影响原型对象。注意观察!"); System.out.println(person1.getName()); System.out.println("他有如下朋友:"); for(Friend friend:person1.getFriends()){ System.out.println(friend.getName()); } System.out.println("克隆的"+person2.getName()); System.out.println("他有如下朋友"); for(Friend friend:person2.getFriends()){ System.out.println(friend.getName()); } } } //实现Cloneable接口 class Friend implements Cloneable { private String name; private int age; private String sex; 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; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } @Override protected Object clone() throws CloneNotSupportedException { Friend friend = (Friend)super.clone(); return friend; } }   

 

 

输出如下:

 

大笨熊
他有如下朋友:
冯XX
王XX
克隆的大笨熊
他有如下克隆的朋友
冯XX
王XX
开始把克隆对象给更名,并且更新克隆对象的好友名称
更新结束
深度克隆,更改克隆对象值,不影响原型对象。注意观察!
大笨熊
他有如下朋友:
冯XX
王XX
克隆的Csdn
他有如下朋友
李XX
刘XX

 

最后谈点个人看法。

原型模式个人感觉算不上什么模式。基本上就是学会克隆对象,以及对象含有引用型的时候怎样去克隆。

 

总之克隆及深度克隆对象就是所谓的原型模式。

你可能感兴趣的:(原型模式(Prototype))