设计模式-原型模式

发布时间:2024年01月24日

?大家好我是苏麟 , 今天聊聊原型模式.

此系列全是帮忙宣传 , 原创放在下面了 .

原型模式

原型模式?种创建型设计模式,该模式的核?思想是基于现有的对象创建新的对象,?不是从头开始创建。 在原型模式中,通常有?个原型对象,它被?作创建新对象的模板。新对象通过复制原型对象的属性和状态来创 建,??需知道具体的创建细节。

为什么要使?原型模式

如果?个对象的创建过程?较复杂时(?如需要经过?系列的计算和资源消耗),那每次创建该对象都需要消耗资源,?通过原型模式就可以复制现有的?个对象来迅速创建/克隆?个新对象,不必关?具体的创建细节,可以降 低对象创建的成本

原型模式的基本实现

原型模式的实现过程即上?描述模块的实现过程:

  • 创建?个抽象类或接?,声明?个克隆?法 clone
  • 实现具体原型类,重写克隆?法
  • 客户端中实例化具体原型类的对象,并调?其克隆?法来创建新的对象。

原型模式的克隆分为浅克隆和深克隆
浅克隆:创建一个新对象,新对象的属性和原来对象完全相同,对于非基本类型属性,仍指向原有属性所指向的对象的内存地址。
深克隆:创建一个新对象,属性中引用的其他对象也会被克降,不再指向原有对象地址。

基本实现 : (浅克隆)

/**
 * @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)

这期就到这里 , 下期见!

文章来源:https://blog.csdn.net/sytdsqzr/article/details/135790760
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。