0 设计模式
不了解设计模式的小伙伴可以通过这篇文章了解一下什么是设计模式
https://blog.csdn.net/qq_42874315/article/details/120006447
1 原型模式
原型模式的本质就是克隆,原型就相当于是一个可供复制的模板,在我们日常使用的时候,无需重新new对象和赋值,直接克隆对象即可。
对象的创建方式有两种:
- new一个对象,指定属性
- 如果新的对象和原来的对象属性差不多,这时可以从原对象克隆
2 实现思路
克隆又分为深克隆和浅克隆
2.1 浅克隆
克隆后的对象中的属性和被克隆对象的属性指向同一个引用,也就是说被克隆对象改变属性,克隆对象也会变
2.2 深克隆
克隆对象和被克隆对象指向的地址不同,一个对象属性的改变不会造成被克隆对象属性的改变
3 需要的类
这里采用Java自带的原型模式
-
需要被克隆的类实现Cloneable接口
-
重写clone方法
-
注意,深克隆和浅克隆的区分就在clone方法中
浅克隆:在clone方法中:return super.clone()
深克隆:在clone方法中:新建一个对象,新对象 = super.clone(),然后return 新对象
4 具体实现
4.1 浅克隆
/**
* 浅克隆(两个对象指向同一个引用,会有影响)
* @Author ChenJiahao(程序员五条)
* @Date 2021/8/26 22:27
*/
public class Test {
public static void main(String[] args) {
Person p1 = new Person();
try {
Person p2 = (Person) p1.clone();
System.out.println(p2.age + " " + p2.score );
System.out.println(p2.loc);
System.out.println(p1.loc == p2.loc);
p1.loc.street = "sh";
System.out.println(p2.loc);
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
class Person implements Cloneable{
int age = 8;
int score = 100;
Location loc = new Location("bj",22);
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
class Location{
String street;
int roomNo;
public Location(String street, int roomNo) {
this.street = street;
this.roomNo = roomNo;
}
@Override
public String toString() {
return "Location{" +
"street='" + street + '\'' +
", roomNo=" + roomNo +
'}';
}
}
4.2 深克隆
/**
* 深克隆处理(克隆与被克隆对象之间没有影响了)
* @Author ChenJiahao(程序员五条)
* @Date 2021/8/26 22:27
*/
public class Test {
public static void main(String[] args) {
Person p1 = new Person();
try {
Person p2 = (Person) p1.clone();
System.out.println(p2.age + " " + p2.score );
System.out.println(p2.loc);
System.out.println(p1.loc == p2.loc);
p1.loc.street = "sh";
System.out.println(p2.loc);
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
class Person implements Cloneable{
int age = 8;
int score = 100;
Location loc = new Location("bj",22);
@Override
public Object clone() throws CloneNotSupportedException {
Person p = (Person) super.clone();
p.loc = (Location) loc.clone();
return p;
}
}
class Location implements Cloneable{
String street;
int roomNo;
public Location(String street, int roomNo) {
this.street = street;
this.roomNo = roomNo;
}
@Override
public String toString() {
return "Location{" +
"street='" + street + '\'' +
", roomNo=" + roomNo +
'}';
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
5 思维导图
6 示例源码地址
https://github.com/ChenJiahao0205/design-pattern/tree/master
最后
我是通过马士兵老师的视频和菜鸟教程学习的,部分内容可能会有雷同
想阅读更多设计模式相关文章,欢迎到我的专栏【设计模式学习笔记】、【设计模式】中去查看
在23篇设计模式文章发布完成之后,我会公开完整的思维导图,点关注,不迷路
感谢大家看到这里,文章如有不足,欢迎大家指出;彦祖点个赞吧彦祖点个赞吧彦祖点个赞吧,欢迎关注程序员五条!