设计模式之原型模式

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)测试结果

相关推荐
百事老饼干8 分钟前
Java[面试题]-真实面试
java·开发语言·面试
customer0816 分钟前
【开源免费】基于SpringBoot+Vue.JS医院管理系统(JAVA毕业设计)
java·vue.js·spring boot·后端·spring cloud·开源·intellij-idea
2402_8575893626 分钟前
SpringBoot框架:作业管理技术新解
java·spring boot·后端
HBryce2430 分钟前
缓存-基础概念
java·缓存
一只爱打拳的程序猿44 分钟前
【Spring】更加简单的将对象存入Spring中并使用
java·后端·spring
杨荧1 小时前
【JAVA毕业设计】基于Vue和SpringBoot的服装商城系统学科竞赛管理系统
java·开发语言·vue.js·spring boot·spring cloud·java-ee·kafka
minDuck1 小时前
ruoyi-vue集成tianai-captcha验证码
java·前端·vue.js
为将者,自当识天晓地。1 小时前
c++多线程
java·开发语言
daqinzl1 小时前
java获取机器ip、mac
java·mac·ip