原型模式
原型模式简单来说就是在类中加一个clone方法,来进行复制。
浅拷贝和深拷贝 :
浅拷贝(浅克隆) :浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。
深拷贝(深克隆) :深复制把要复制的对象所引用的对象都复制了一遍。
可以利用串行化来做深复制,所谓对象序列化就是将对象的状态转换成字节流,以后可以通过这些值再生成相同状态的对象。
package com.Prototype;
import java.util.ArrayList;
import java.util.List;
public class TXGame implements Cloneable{
//tx
private String name;
//游戏类型
private String kids;
//朋友
private List<String> games;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getKids() {
return kids;
}
public void setKids(String kids) {
this.kids = kids;
}
public List<String> getGames() {
return games;
}
public void setGames(List<String> games) {
this.games = games;
}
//重写toString方法
@Override
public String toString() {
return "TXGame [name=" + name + ", kids=" + kids + ", games=" + games + "]";
}
//浅层克隆
public TXGame shallowClone() {
try {
return (TXGame) super.clone();
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
//深层克隆
public TXGame deepClone() {
try {
TXGame TXGame = (TXGame) super.clone();
List<String> newgames = new ArrayList<String>();
for(String friend : this.getGames()) {
newgames.add(friend);
}
TXGame.setGames(newgames);
return TXGame;
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
package com.Prototype;
import java.util.ArrayList;
import java.util.List;
public class MainClass {
public static void main(String[] args) {
//创建对象TXGame1
TXGame TXGame1 = new TXGame();
//初始化对象
TXGame1.setName("腾讯");
TXGame1.setKids("游戏类型");
List<String> games = new ArrayList<String>();
games.add("穿越火线");
games.add("QQ飞车");
TXGame1.setGames(games);
//TXGame2是浅层克隆
TXGame TXGame2 = TXGame1.shallowClone();
//TXGame3是深层克隆
TXGame TXGame3 = TXGame1.deepClone();
//获取浅层克隆的games的list对象
List<String> TXGame2_games = TXGame2.getGames();
//向引用对象中添加值
TXGame2_games.add("王者荣耀");
TXGame2.setGames(TXGame2_games);
//获取深层克隆的games的list对象
List<String> TXGame3_games = TXGame3.getGames();
//向引用对象中添加值
TXGame3_games.add("使命召唤");
TXGame3.setGames(TXGame3_games);
System.out.println("原型:"+TXGame1);
System.out.println("浅层克隆:"+TXGame2);
System.out.println("深层克隆:"+TXGame3);
}
}
从结果中可以发现,浅层克隆的TXGame2中向games列表中添加的shallow游戏,而在原型TXGame1中也添加了游戏,验证了前面的说法。深层克隆TXGame3是在TXGame2之前克隆的,所以没有添加shallow(浅层)游戏,而之后添加的deep(深层)游戏也没有影响TXGame1和TXGame2中的games列表。