?大家好我是苏麟 , 今天聊聊原型模式.
此系列全是帮忙宣传 , 原创放在下面了 .
原型模式?种创建型设计模式,该模式的核?思想是基于现有的对象创建新的对象,?不是从头开始创建。 在原型模式中,通常有?个原型对象,它被?作创建新对象的模板。新对象通过复制原型对象的属性和状态来创 建,??需知道具体的创建细节。
为什么要使?原型模式
如果?个对象的创建过程?较复杂时(?如需要经过?系列的计算和资源消耗),那每次创建该对象都需要消耗资源,?通过原型模式就可以复制现有的?个对象来迅速创建/克隆?个新对象,不必关?具体的创建细节,可以降 低对象创建的成本
原型模式的基本实现
原型模式的实现过程即上?描述模块的实现过程:
原型模式的克隆分为浅克隆和深克隆
浅克隆:创建一个新对象,新对象的属性和原来对象完全相同,对于非基本类型属性,仍指向原有属性所指向的对象的内存地址。
深克隆:创建一个新对象,属性中引用的其他对象也会被克降,不再指向原有对象地址。
基本实现 : (浅克隆)
/**
* @className: Realize
* @author: SL 苏麟
**/
public class RealizeType implements Cloneable{
public RealizeType() {
System.out.println("原型对象创建完毕!!!");
}
@Override
protected RealizeType clone() throws CloneNotSupportedException {
System.out.println("克隆对象克隆成功");
return (RealizeType) super.clone();
}
}
/**
* @className: Client
* @author: SL 苏麟
**/
public class Client {
public static void main(String[] args) throws CloneNotSupportedException {
RealizeType realizeType = new RealizeType();
RealizeType clone = realizeType.clone();
System.out.println(realizeType == clone);
}
}
证明我们创建出来的对象不是一个
/**
* @className: Student
* @author: SL 苏麟
**/
public class Student {
private String name;
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
'}';
}
}
/**
* @className: Realize
* @author: SL 苏麟
**/
public class RealizeType implements Cloneable{
private Student student;
public void setStudent(Student student) {
this.student = student;
}
public Student getStudent() {
return student;
}
public RealizeType() {
}
@Override
protected RealizeType clone() throws CloneNotSupportedException {
return (RealizeType) super.clone();
}
@Override
public String toString() {
return "RealizeType{" +
"student=" + student +
'}';
}
}
/**
* @className: Client
* @author: SL 苏麟
**/
public class Client {
public static void main(String[] args) throws CloneNotSupportedException {
RealizeType realizetype = new RealizeType();
Student student = new Student();
student.setName("苏麟");
realizetype.setStudent(student);
RealizeType clone = realizetype.clone();
System.out.println(realizetype.getStudent() == clone.getStudent());
System.out.println(realizetype);
System.out.println(clone);
}
}
浅拷贝的引用对象Student是同一个
基本实现 : (深克隆)
import java.io.Serializable;
/**
* @className: Student
* @author: SL 苏麟
**/
public class Student implements Serializable {
private String name;
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
'}';
}
}
import java.io.Serializable;
/**
* @className: Realize
* @author: SL 苏麟
**/
public class RealizeType implements Cloneable, Serializable {
private Student student;
public void setStudent(Student student) {
this.student = student;
}
public Student getStudent() {
return student;
}
public RealizeType() {
}
@Override
protected RealizeType clone() throws CloneNotSupportedException {
return (RealizeType) super.clone();
}
@Override
public String toString() {
return "RealizeType{" +
"student=" + student +
'}';
}
}
import java.io.*;
/**
* @className: Client
* @author: SL 苏麟
**/
public class Client {
public static void main(String[] args) throws Exception {
RealizeType realizetype = new RealizeType();
Student student = new Student();
student.setName("苏麟");
realizetype.setStudent(student);
//创建对象输出流对象
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D:/sl/sl.txt"));
//写对象
oos.writeObject(realizetype);
//释放资源
oos.close();
//创建对象输入流对象
ObjectInputStream ooi = new ObjectInputStream(new FileInputStream("D:/sl/sl.txt"));
//读取对象
RealizeType clone = (RealizeType) ooi.readObject();
//释放资源
ooi.close();
clone.getStudent().setName("杨科");
System.out.println(realizetype);
System.out.println(clone);
}
}
深拷贝需要借助IO流来实现?
原创地址?:?GitHub - youngyangyang04/kama-DesignPattern: 卡码网-23种设计模式精讲,每种设计模式都配套代码练习题,支持 Java,CPP,Python,Go
了解更多 :?原型模式 | 菜鸟教程 (runoob.com)
这期就到这里 , 下期见!