基本介紹
- 原型模式(Prototype模式)是指:用原型實(shí)例指定創(chuàng)建對(duì)象的種類会前,并且通過(guò)拷 貝這些原型,創(chuàng)建新的對(duì)象 驶社。
- 原型模式是一種創(chuàng)建型設(shè)計(jì)模式堵腹,允許一個(gè)對(duì)象再創(chuàng)建另外一個(gè)可定制的對(duì)象, 無(wú)需知道如何創(chuàng)建的細(xì)節(jié) 。
- 工作原理是:通過(guò)將一個(gè)原型對(duì)象傳給那個(gè)要發(fā)動(dòng)創(chuàng)建的對(duì)象吁讨,這個(gè)要發(fā)動(dòng)創(chuàng)建 的對(duì)象通過(guò)請(qǐng)求原型對(duì)象拷貝它們自己來(lái)實(shí)施創(chuàng)建髓迎,即 對(duì)象.clone()。
深拷貝之普通重寫
復(fù)制一個(gè)對(duì)象建丧,連帶屬性的值復(fù)制出來(lái)排龄,屬性如果是引用類型,那么是一個(gè)地址翎朱,用了另外的空間橄维。
代碼實(shí)現(xiàn)(原型是重點(diǎn))
原型類
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.調(diào)用淺拷貝將所有屬性的值拷貝過(guò)來(lái)
people = (People) super.clone();
//2.調(diào)用引用類型屬性的克隆方法覆蓋當(dāng)前的屬性值
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 ;
/**
* 如果沒(méi)有引用類型 就用淺拷貝 默認(rèn)的
* @return
* @throws CloneNotSupportedException
*/
@Override
protected Friend clone() throws CloneNotSupportedException {
Friend friend = (Friend) super.clone();
return friend;
}
}
測(cè)試
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
}
}