原型模式:
原型模式别名为克隆模式,原型模式是已一个已有的对象可能出一个一模一样的对象,该对象的属性和原有的对象一模一样(例如:get set 方法), 但是也不会影响原有对象的属性
原型模式分为两种类型: 浅克隆模式 深克隆模式
原型模式实现方法:对象需要改实现 Cloneable 和 Serializable 两个接口,
下面我们来分别说下这两个克隆模式
浅克隆模式:
/*** 原型模式 也为克隆模式* 核心: 即已一个对象为原型,克隆出一个一模一样的对象, 该对象的属性和原有的对象一模一样,同时不影响原有的对象没有任何影响* 分类:原型模式分为两种类别 浅克隆模式 和 深度克隆模式* 实现:实现克隆模式,对象需实现 Cloneable 和 Serializable 两个接口* 浅克隆模式:*/
public class Prototype implements Cloneable, Serializable {private String name;private Date birth;private int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public Date getBirth() {return birth;}public void setBirth(Date birth) {this.birth = birth;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic Object clone() throws CloneNotSupportedException{return super.clone();}public static void main(String[] args) throws Exception{Prototype prototype = new Prototype();prototype.setAge(1);prototype.setName("肖斌");prototype.setBirth(new Date());System.out.println(prototype);System.out.println(prototype.getAge());System.out.println(prototype.getName());System.out.println(prototype.getBirth());System.out.println("-------------------------------------------------------");Prototype prototypeClone = (Prototype)prototype.clone();System.out.println(prototypeClone);prototypeClone.setName("打蜡");System.out.println(prototypeClone.getAge());System.out.println(prototypeClone.getName());System.out.println(prototypeClone.getBirth());System.out.println("-------------------------------------------------------");System.out.println(prototype.getAge());System.out.println(prototype.getName());System.out.println(prototype.getBirth());/*** com.xbin.quartz.model.prototype.Prototype@69d0a921* 1* 肖斌* Fri Oct 23 09:29:19 CST 2020* -------------------------------------------------------* com.xbin.quartz.model.prototype.Prototype@5c29bfd* 1* 打蜡* Fri Oct 23 09:29:19 CST 2020* -------------------------------------------------------* 1* 肖斌* Fri Oct 23 09:29:19 CST 2020** 结论: 浅克隆模式: 在原对象的基础上克隆了一个不一样的对象,但是对象指向的值的引用是同一个
被复制的对象的所有变量都含有与原来的对象相同的值*/}
}
深克隆模式:
/*** 原型模式 也为克隆模式* 核心: 即已一个对象为原型,克隆出一个一模一样的对象, 该对象的属性和原有的对象一模一样,同时不影响原有的对象没有任何影响* 分类:原型模式分为两种类别 浅克隆模式 和 深度克隆模式* 实现:实现克隆模式,对象需实现 Cloneable 和 Serializable 两个接口* 深度克隆模式:*/
public class Prototype implements Cloneable, Serializable {private String name;private Date birth;private int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public Date getBirth() {return birth;}public void setBirth(Date birth) {this.birth = birth;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic Object clone() throws CloneNotSupportedException{Prototype prototype = (Prototype) super.clone();// 实现深度克隆(deep clone)prototype.birth = (Date) this.birth.clone();return prototype;}public static void main(String[] args) throws Exception{Prototype prototype = new Prototype();prototype.setAge(1);prototype.setName("肖斌");prototype.setBirth(new Date());System.out.println(prototype);System.out.println(prototype.getAge());System.out.println(prototype.getName());System.out.println(prototype.getBirth());System.out.println("-------------------------------------------------------");Prototype prototypeClone = (Prototype)prototype.clone();//修改原有对象的Date Birth 属性值prototype.setBirth(DateUtil.getDayAfter(new Date(), 1));System.out.println(prototype.getBirth());System.out.println(prototypeClone);prototypeClone.setName("打蜡");System.out.println(prototypeClone.getAge());System.out.println(prototypeClone.getName());System.out.println(prototypeClone.getBirth());/*** com.xbin.quartz.model.prototype.Prototype@69d0a921* 1* 肖斌* Fri Oct 23 09:55:16 CST 2020* -------------------------------------------------------* Sat Oct 24 09:55:16 CST 2020* com.xbin.quartz.model.prototype.Prototype@4b9af9a9* 1* 打蜡* Fri Oct 23 09:55:16 CST 2020* 结论: 从深度克隆的角度上可以到出: 当对 Birth 进行深度克隆之后,原对象的属性值修改不会影响到克隆对象的属性值* 说明: 深度克隆之后,克隆对象中深度克隆的属性值和原对象的属性值引用不是同一个*/}
}