设计模式之原型模式

1.原型模式概念

通过复制一个现有的对象实例来创建新对象,而不是通过直接实例化对象。这样可以避免构造过程中的开销,并允许根据需要定制对象的创建过程。

2.原型模式实现的两种方式

1)java字节流拷贝

通过继承Cloneable类,通过调用super.clone()方法克隆对象(也可以使用Serializable接口,使用java字节流进行拷贝),然后在类型转化就能实现和原来一模一样的对象,并且对象的地址,是不一样的。克隆的对象和源对象的数据一模一样,克隆过程无法定制。如果需要定制克隆的话推荐第二种.

2)创建对象拷贝

通过new StudentC()对象的方式,并且把数据一一设置到新的对象中,然后返回对象就可以得到克隆的对象,并且对象的地址,是不一样的。但如果对象比较大的话,设置起来会非常麻烦,如果对克隆没有什么要求,推荐第一种。

3.举个例子

上小学时,小久周六,周日没写作业,第二天找到同学惜己的作业抄了一下。

4.代码实现

1)原型类

java 复制代码
package org.xiji.Prototype2;



import java.io.*;

public class StudentC implements Serializable,Cloneable{
    private String name;
    private int age;

    public StudentC(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public StudentC() {
    }

    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;
    }

    /**
     * 使用Cloneable接口,直接调用父接口的方法
     */
    public StudentC cloneByCloneable() {
        try {
            // 调用父接口的克隆方法 ===》并且进行强转
            return (StudentC) super.clone();

        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 通过java字节流流克隆对象
     */

    public StudentC cloneByStream() {
        try {

            ByteArrayOutputStream outPutStream = new ByteArrayOutputStream();

            ObjectOutputStream objectOutputStream = new ObjectOutputStream(outPutStream);

            objectOutputStream.writeObject(this);


            ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(outPutStream.toByteArray());


            ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);


            return (StudentC) objectInputStream.readObject();


        } catch (Exception e) {
            e.printStackTrace();

        }



        return null;
    }

    /**
     * 通过创建对象的方式克隆
     * 如果对象的属性少话,还行,但是如果对象的多的话就不如上面的那种方法
     */
    public StudentC cloneByNew() {
        return new StudentC(this.name, this.age);
    }
}

2)原型测试类

java 复制代码
package org.xiji.Prototype2;

/**
 * 原型模式测试类
 */
public class Prototype2 {
    public static void main(String[] args) throws CloneNotSupportedException {


        StudentC xiji = new StudentC("惜己", 18);
        System.out.println("xiji.name = " + xiji.getName());
        System.out.println("================================");
        //通过Cloneable实现克隆方法
        System.out.println("通过java字节流实现克隆方法");
        StudentC cloneS = xiji.cloneByStream();

        System.out.println("cloneS.name = " + cloneS.getName());

        System.out.println("判断两个对象是否相等");
        System.out.println(xiji.equals(cloneS));

        System.out.println("================================");

        //通过创建对象的方法克隆对象
        System.out.println("通过创建对象的方法克隆对象");
        StudentC studentC = xiji.cloneByNew();
        System.out.println("studentC.name = " + studentC.getName());

        System.out.println("判断两个对象是否相等");
        System.out.println(xiji.equals(studentC));
        System.out.println("================================");

        //通过Cloneable类型实现克隆方法
        System.out.println("通过Cloneable类型实现克隆方法");
        StudentC cloneable = xiji.cloneByCloneable();
        System.out.println("cloneable.name = " + cloneable.getName());
        System.out.println("判断两个对象是否相等");
        System.out.println(xiji.equals(cloneable));

    }
}

3)测试结果

相关推荐
会员果汁20 小时前
13.设计模式-适配器模式
设计模式·适配器模式
海边的Kurisu21 小时前
苍穹外卖日记 | Day1 苍穹外卖概述、开发环境搭建、接口文档
java
C雨后彩虹1 天前
任务最优调度
java·数据结构·算法·华为·面试
heartbeat..1 天前
Spring AOP 全面详解(通俗易懂 + 核心知识点 + 完整案例)
java·数据库·spring·aop
Jing_jing_X1 天前
AI分析不同阶层思维 二:Spring 的事务在什么情况下会失效?
java·spring·架构·提升·薪资
元Y亨H1 天前
Nacos - 服务发现
java·微服务
微露清风1 天前
系统性学习C++-第十八讲-封装红黑树实现myset与mymap
java·c++·学习
dasi02271 天前
Java趣闻
java
阿波罗尼亚1 天前
Tcp SSE Utils
android·java·tcp/ip
susu10830189111 天前
springboot3.5.8整合minio8.5.9
java·springboot