设计模式之原型模式

目录

1.原型模式概念

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

1)java字节流拷贝

2)创建对象拷贝

3.举个例子

4.代码实现

1)原型类

2)原型测试类

3)测试结果

附录:

1)23种设计模式讲解地址

2)23种设计模式源码下载地址:


1.原型模式概念

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

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

1)java字节流拷贝

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

2)创建对象拷贝

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

主要部分:

  1. 对象:这是要复制的对象,包含属性和方法。
  2. 字节流拷贝:这是通过字节流复制对象的方式,将对象的数据复制到新的命名空间内。
  3. 创建对象拷贝:这是通过创建新的对象并设置其属性的方式复制对象。

3.举个例子

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

主要部分:

  1. 小久:这是要复制的对象,包含属性和方法。
  2. 放假没有写作业:这是通过字节流复制对象的方式,将对象的数据复制到新的命名空间内。
  3. 找到同学惜己:这是通过创建新的对象并设置其属性的方式复制对象。

通过这种方式,原型模式允许通过复制现有的对象来创建新的对象,而无需知道其具体实现。

4.代码实现

1)原型类

        这段代码定义了一个 StudentC 类,实现了 Serializable 和 Cloneable 接口,并提供了三种不同的克隆方法。
                类定义
                        StudentC 类实现了 Serializable 和 Cloneable 接口。


                成员变量
                        private String name:学生的姓名。
                        private int age:学生的年龄。


                构造方法
                        public StudentC(String name, int age):带参数的构造方法。
                        public StudentC():无参构造方法。


                克隆方法
                        public StudentC cloneByCloneable():使用 Cloneable 接口实现克隆。
                        public StudentC cloneByStream():使用 Java 字节流实现克隆。
                        public StudentC cloneByNew():通过创建新对象的方式实现克隆。

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)原型测试类

        初始化对象
                创建一个 StudentC 对象 xiji,并初始化其属性。
                输出 xiji 的名称。
        克隆对象
                通过 Java 字节流实现克隆
                调用 xiji.cloneByStream() 方法克隆对象。
                输出克隆对象 cloneS 的名称。
                比较原始对象 xiji 与克隆对象 cloneS 是否相等。
        通过创建新对象的方法实现克隆
                调用 xiji.cloneByNew() 方法克隆对象。
                输出克隆对象 studentC 的名称。
                比较原始对象 xiji 与克隆对象 studentC 是否相等。
        通过 Cloneable 接口实现克隆
                调用 xiji.cloneByCloneable() 方法克隆对象。
                输出克隆对象 cloneable 的名称。
                比较原始对象 xiji 与克隆对象 cloneable 是否相等。

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

附录:

1)23种设计模式讲解地址

23种设计模式讲解地址

专题地址:https://blog.csdn.net/2301_76862031/category_12779841.html


 设计模式之访问者模式地址:  https://blog.csdn.net/2301_76862031/article/details/141716629

 设计模式之简单工厂模式地址: https://blog.csdn.net/2301_76862031/article/details/141641161
 设计模式之策略模式工厂地址:https://blog.csdn.net/2301_76862031/article/details/141647304

设计模式之备忘录模式地址:     https://blog.csdn.net/2301_76862031/article/details/141678153
 
 设计模式之代理模式: https://blog.csdn.net/2301_76862031/article/details/141681834
 
 设计模式之单例模式: https://blog.csdn.net/2301_76862031/article/details/141684340
 
 设计模式之迭代器模式: https://blog.csdn.net/2301_76862031/article/details/141690379
 
 设计模式之观察者模式:https://blog.csdn.net/2301_76862031/article/details/141723684
 
 设计模式之命令模式: https://blog.csdn.net/2301_76862031/article/details/141728371
 
 设计模式之模板方法模式: https://blog.csdn.net/2301_76862031/article/details/141729898
 
 设计模式之桥接模式: https://blog.csdn.net/2301_76862031/article/details/141748997
 
 设计模式之适配器模式: https://blog.csdn.net/2301_76862031/article/details/141752130
 
 设计模式之外观模式: https://blog.csdn.net/2301_76862031/article/details/141753019

设计模式之享元模式: https://blog.csdn.net/2301_76862031/article/details/141755905
 
 设计模式之原型模式: https://blog.csdn.net/2301_76862031/article/details/141759296
 
 设计模式之责任链模式: https://blog.csdn.net/2301_76862031/article/details/141760704

 设计模式之中介模式: https://blog.csdn.net/2301_76862031/article/details/141777728
 
 设计模式之装饰者模式: https://blog.csdn.net/2301_76862031/article/details/141784167
 
 设计模式之状态模式: https://blog.csdn.net/2301_76862031/article/details/141786766
 
 设计模式之组合模式: https://blog.csdn.net/2301_76862031/article/details/141787708
 
 设计模式之工厂方法模式: https://blog.csdn.net/2301_76862031/article/details/141826862
 
 设计模式之解释器模式: https://blog.csdn.net/2301_76862031/article/details/141859953
 

2)23种设计模式源码下载地址:

java23种设计模式的实现代码(): 23种设计模式的实现使用java,并且均已经通过测试

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值