1.定義
當多個地方需要修改某個對象的值或者屬性题画,而重新new會消耗大量的資源(磁盤舞箍,硬件)碎乃,這個時候可以考慮使用原型設(shè)計模式,通過拷貝對象來完成對象的復(fù)用
2.分類
淺拷貝:副本中的字段引用原始的字段(當字段是引用數(shù)據(jù)類型的時候殉簸,對拷貝的副本進行修改闰集,會同時修改原始的字段)
深拷貝:當原始字段是引用數(shù)據(jù)類型時,對該字段進行clone
3.代碼
實體類
/**
*用戶實體類
*@author woochen123
*@time 2018/1/5 11:24
*@desc
*/
public class User implements Cloneable{
public int age;
public String name;
public String phoneNum;
public Address address;
@Override
protected User clone() {
User user = null;
try {
user = (User) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return user;
}
}
/**
*用戶地址類
*@author woochen123
*@time 2018/1/5 11:24
*@desc
*/
public class Address {
public String city;
public String distinct;
public String street;
public Address(String city, String distinct, String street) {
this.city = city;
this.distinct = distinct;
this.street = street;
}
}
操作層
/**
*登錄接口
*@author woochen123
*@time 2018/1/5 11:26
*@desc
*/
public interface Login {
void login();
}
/**
*登錄實體類
*@author woochen123
*@time 2018/1/5 11:27
*@desc
*/
public class LoginImpl implements Login {
@Override
public void login() {
//登錄到服務(wù)器獲取用戶信息
User loginedUser = new User();
//將服務(wù)器設(shè)置的用戶信息設(shè)置給loginedUser對象
loginedUser.age = 24;
loginedUser.name = "woochen123";
loginedUser.address = new Address("浙江","杭州","西湖區(qū)");
//將登錄用戶保存到本地緩存
LoginSession.getLoginSession().setLoginUser(loginedUser);
}
}
數(shù)據(jù)存儲
/**
* 登錄緩存
*
* @author woochen123
* @time 2018/1/5 11:35
* @desc
*/
public class LoginSession {
private static LoginSession mLoginSession;
User user;
public static LoginSession getLoginSession() {
if (mLoginSession == null) {
mLoginSession = new LoginSession();
}
return mLoginSession;
}
void setLoginUser(User user) {
//與登錄模塊不在一個包中的類將無法調(diào)用此方法
this.user = user;
}
public User getLoginUser() {
//在外部模塊拿到的是克隆對象般卑,不會對原始用戶實體對象造成任何影響
return user.clone();
}
}
4.總結(jié)
- 在進行拷貝操作的時候不會執(zhí)行類的構(gòu)造方法
5.應(yīng)用
- 保護性拷貝(當某個對象對外需要只進行只讀性操作時武鲁,可以通過對象拷貝進行只讀的限制)