基本介绍
- 原型模式(Prototype模式)是指:用原型实例指定创建对象的种类,并且通过拷 贝这些原型,创建新的对象 。
- 原型模式是一种创建型设计模式,允许一个对象再创建另外一个可定制的对象, 无需知道如何创建的细节 。
- 工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建 的对象通过请求原型对象拷贝它们自己来实施创建,即 对象.clone()。
深拷贝之普通重写
复制一个对象,连带属性的值复制出来,属性如果是引用类型,那么是一个地址,用了另外的空间。
代码实现(原型是重点)
原型类
package com.yuan.dp.prototype.domain;
public class People implements Cloneable {
private String name;
private int age;
private Friend friend;
public People() {
super();
}
public People(String name, int age, Friend friend) {
this.name = name;
this.age = age;
this.friend = friend;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Friend getFriend() {
return friend;
}
public void setFriend(Friend friend) {
this.friend = friend;
}
/**
* 第1种 深拷贝方法
*
* @return
*/
@Override
public People clone() {
People people = null;
try {
//1.调用浅拷贝将所有属性的值拷贝过来
people = (People) super.clone();
//2.调用引用类型属性的克隆方法覆盖当前的属性值
people.friend = friend.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return people;
}
@Override
public String toString() {
return "People{" +
"name='" + name +
", age=" + age +
", friend=" + friend.hashCode() +
'}';
}
}
引用类型属性类
package com.yuan.dp.prototype.domain;
import java.io.Serializable;
public class Friend implements Cloneable, Serializable {
public String name ;
public String hobby ;
/**
* 如果没有引用类型 就用浅拷贝 默认的
* @return
* @throws CloneNotSupportedException
*/
@Override
protected Friend clone() throws CloneNotSupportedException {
Friend friend = (Friend) super.clone();
return friend;
}
}
测试
package com.yuan.dp.prototype;
import com.yuan.dp.prototype.domain.Friend;
import com.yuan.dp.prototype.domain.People;
/**
* 深拷贝 拷贝
*
* @author Yuan-9826
*/
public class Prototype_2 {
public static void main(String[] args) {
Friend friend = new Friend();
People yuan_1 = new People("yuan", 18, friend);
System.out.println("yuan_1 = " + yuan_1);
//yuan_1 = People{name='yuan, age=18, friend=42121758}
People yuan_2 = yuan_1.clone();
System.out.println("yuan_2 = " + yuan_2);
//yuan_2 = People{name='yuan, age=18, friend=20671747}
System.out.println(yuan_1 == yuan_2);
//false
}
}
网友评论