🍭原型模式
🍎定义
原型模式(Prototype Pattern):是用于创建重复的对象,同时又能保证性能。
🍟深克隆和浅克隆
原型模式的克隆可以分为浅克隆
和深克隆
:
-
浅克隆:创建一个新对象,新对象的属性和原来对象的属性完全相同,对于非基本类型的属性,仍然指向原有属性所指向的对象的内存地址。
-
深克隆:创建一个新对象,属性中引用的其他对象也会被克隆,不再指向原有对象地址。
Java中的Object类中提供clone()
方法来实现浅克隆。Cloneable
接口就是抽象原型类,而实现了Cloneable
接口的子实现类就是具体的原型类。
🍔代码实现
/**
* 当前对象是可克隆的
*
* @author zhuicat
* @since 2024/3/6 16:07
*/
@Data
public class User implements Cloneable {
private String username;
private Integer age;
public User() {
System.out.println("User 对象创建");
}
/**
* 再创建一个人,赋予我的所有属性
* @return
* @throws CloneNotSupportedException
*/
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public class ZhuiMybatis {
// 缓存 user
Map<String, User> userCache = new HashMap<>();
/**
* 从数据库查数据
*/
public User getUser(String username) throws CloneNotSupportedException {
User user = null;
if (!userCache.containsKey(username)) {
// 缓存中没有从数据库查
user = getUserFromDB(username);
}else {
// 从缓存中直接拿,脏缓存问题
// 原型已经拿到,但是不能直接给。(本人)
user = userCache.get(username);
// 从这个对象中快速得到一个克隆体(克隆人)===> 原型模式
}
user = (User) user.clone();
return user;
}
private User getUserFromDB(String username) {
System.out.println("从数据查到了数据," + username + " 并且创建了对象");
User user = new User();
user.setUsername(username);
user.setAge(18);
userCache.put(username,user);
return user;
}
}
public class MainTest {
public static void main(String[] args) throws CloneNotSupportedException {
ZhuiMybatis mybatis = new ZhuiMybatis();
User user1 = mybatis.getUser("张三");
user1.setUsername("里斯");
System.out.println("user1 =>" + user1);
User user2 = mybatis.getUser("张三");
System.out.println("user2 =>" + user2);
User user3 = mybatis.getUser("张三");
System.out.println("user3 =>" + user3);
}
}
从数据查到了数据,张三 并且创建了对象
User 对象创建
user1 =>User(username=里斯, age=18)
user2 =>User(username=张三, age=18)
user3 =>User(username=张三, age=18)
🍕应用场景
什么场景用到?
- 资源优化
- 性能和安全要求
- 一个对象多个修改者的场景
- 一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时可以考虑使用原型模式拷贝多个对象提供调用者使用。
- 深克隆、浅克隆