基本介绍
- 原型模式(Prototype模式)是指:用原型实例指定创建对象的种类,并且通过拷 贝这些原型,创建新的对象 。
- 原型模式是一种创建型设计模式,允许一个对象再创建另外一个可定制的对象, 无需知道如何创建的细节 。
- 工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建 的对象通过请求原型对象拷贝它们自己来实施创建,即 对象.clone()。
浅拷贝
复制一个对象,连带属性的值复制出来,属性如果是引用类型,那么复制的是地址。
代码实现(原型是重点)
原型类
package com.yuan.dp.prototype.domain;
/**
* 实体类 绵羊
*
* @author Yuan-9826
*/
public class Sheep implements Cloneable {
private String name;
private String color;
private Friend friend;
public Sheep() {
}
public Sheep(String name, String color, Friend friend) {
this.name = name;
this.color = color;
this.friend = friend;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public Friend getFirSheep() {
return friend;
}
public void setWeight(Friend friend) {
this.friend = friend;
}
@Override
public String toString() {
return "Sheep{" +
"name='" + name + '\'' +
", color='" + color + '\'' +
", friend='" + friend.hashCode() + '\'' +
'}';
}
/**
* 浅拷贝使用默认方法 记得要强转类型 不然调用的时候就要强转 同理也要try catch
*
* @return
* @throws CloneNotSupportedException
*/
@Override
public Sheep clone() {
Sheep clone = null;
try {
clone = (Sheep) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return clone;
}
}
引用类型属性类
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.Sheep;
/**
* 浅拷贝 只拷贝了属性的值
*
* @author Yuan-9826
*/
public class Prototype_1 {
public static void main(String[] args) {
Friend friend = new Friend();
Sheep sheep_1 = new Sheep("喜羊羊", "白色", friend);
System.out.println("sheep_1 = " + sheep_1);
//sheep_1 = Sheep{name='喜羊羊', color='白色', friend='42121758'}
Sheep sheep_2 = sheep_1.clone();
System.out.println("sheep_2 = " + sheep_2);
//sheep_2 = Sheep{name='喜羊羊', color='白色', friend='42121758'}
System.out.println(sheep_1 == sheep_2);
//false
}
}