一,克隆羊问题
现在有一只羊tom,姓名为tom,年龄为1,颜色为白色,请编写程序创建和tom属性完全相同的10只
二,传统方式解决
1.sheep类
package 设计模式.原型模式.传统方式;
public class Sheeep {
private String name;
private int age;
private String color;
public Sheeep(String name,int age,String color){
super();
this.name=name;
this.age=age;
this.color=color;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
2.Client类完成复制
package 设计模式.原型模式.传统方式;
public class Client {
public static void main(String []args){
Sheeep sheeep=new Sheeep("tom",1,"white");
Sheeep[]sheeeps=new Sheeep[10];
for(int i=0;i<10;i++){
sheeeps[i]=new Sheeep(sheeep.getName(),sheeep.getAge(),sheeep.getColor());
}
}
}
3.优缺点
优点:比较好理解简单易操作
缺点:在创建新的对象时,总是需要获取原始对象的属性,如果创建的对象比较复杂,效率较低
总是需要重新初始化对象,而不是动态的获取对象的运行时状态,不够灵活
4.改进思路
java中Object类是所有类的基类,Object类提供了一个clone()方法,该方法可以将一个java对象复制一份,但是需要实现clone的Java类必须要实现Cloneble接口---->原型模式
三,原型模式
1.原型模式:用原型实例创建指定对象的种类,并且通过拷贝这些原型,创建新的对象
2.原型模式时一种创建型设计模式,允许一个对象再创建另一个可定制对象,无需知道创建的细节
3.工作原理:a=原型对象.clone()
4.代码
Sheep
package 设计模式.原型模式.improve;
import 设计模式.原型模式.传统方式.Sheeep;
public class Sheep implements Cloneable {
private String name;
private int age;
private String color;
Sheep(String name,int age,String color){
this.name=name;
this.age=age;
this.color=color;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
protected Object clone(){
Sheep sheep=null;
try {
sheep=(Sheep) super.clone();
}catch (Exception e){
System.out.println(e.getMessage());
}
return sheep;
}
}
Client
package 设计模式.原型模式.improve;
public class Client {
public static void main(String []args){
Sheep sheep=new Sheep("tom",1,"white");
Sheep []sheeps=new Sheep[10];
for(int i=0;i<10;i++){
sheeps[i]=(Sheep)sheep.clone();
}
}
}
四,深拷贝和浅拷贝
浅拷贝
1.对于数据类类型是基本数据类型成员变量,浅拷贝会直接进行值传递,也就是将属性值复制一份给新的对象
2.对于数据类型是引用数据类型的成员变量,比如说成员变量是某个数组,某个类的对象等,浅拷贝会直接进行引用传递
3.克隆羊就是浅拷贝
深拷贝
1.赋值对象的所有基本数据类型的成员变量值
2.为所有引用数据类型的成员变量申请存储空间,并复制每一个引用数据类型成员变量所引用的对象
3.实现:用过clone实现
通过对象序列化
来源:CSDN
作者:java的舔狗
链接:https://blog.csdn.net/qq_43416494/article/details/104491765