原型模式(Prototype)

本文详细介绍了Java中的原型模式,包括Prototype接口、ConcretePrototype实现和Client客户端的使用。讨论了浅拷贝和深拷贝的区别,并通过示例代码展示了如何在原型对象的clone()方法中实现深拷贝。该模式适用于需要快速创建大量类似对象的场景,提高了性能。同时,文章还提供了一个克隆工厂类PrototypeFactory,用于演示如何获取克隆对象。
摘要由CSDN通过智能技术生成

原型模式的各角色定义如下

● Prototype(原型接口):声明克隆方法,对应本例程代码中的Cloneable接口。

● ConcretePrototype(原型实现):原型接口的实现类,实现方法中调用super.clone()即可得到新克隆的对象。

● Client(客户端):客户端只需调用实现此接口的原型对象方法clone(),便可轻松地得到一个全新的实例对象。

从类到对象叫做“创建”, 从实例对象到副本对象叫做“克隆”

使用场景

当需要创建多个类似的复杂对象时,可以考虑原型模式,克隆操作只会进行内存操作,直接拷贝原型对象数据流生成新的副本对象,不会触发一些复杂操作(初始化),效率远远大于‘new’ 关键字触发的实例化操作

浅拷贝/深拷贝

浅拷贝:只复制原始类型的值

深拷贝:不只复制原始类型的值,引用对象也拷贝

实现细节

原型对象和引用对象都需要实现 java.lang.Cloneable 接口, 重写 clone() 方法

public class PrototypeDemo implements Cloneable{
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

浅拷贝

1575990648be6c49aa52455a8d277a74.png

深拷贝

 区别主要在于:在原型对象的clone() 方法中是否克隆引用对象?

    @Override
    protected PrototypeDemo clone() throws CloneNotSupportedException {

        PrototypeDemo prototypeDemo = (PrototypeDemo) super.clone();
        // 是否克隆引用对象
        prototypeDemo.setSubPrototypeDemo(subPrototypeDemo.clone());
        return prototypeDemo;
    }

实例代码如下

package com.azure.design.prototype;
/**
*	原型类
*/
public class PrototypeDemo implements Cloneable{

    private String name;

    private  SubPrototypeDemo subPrototypeDemo = new SubPrototypeDemo("引用类");

    public PrototypeDemo(String name) {
        this.name = name;
    }


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public SubPrototypeDemo getSubPrototypeDemo() {
        return subPrototypeDemo;
    }

    public void setSubPrototypeDemo(SubPrototypeDemo subPrototypeDemo) {
        this.subPrototypeDemo = subPrototypeDemo;
    }

    public PrototypeDemo(String name, SubPrototypeDemo subPrototypeDemo) {
        this.name = name;
        this.subPrototypeDemo = subPrototypeDemo;
    }

    @Override
    public String toString() {
        return "PrototypeDemo{" +
                "name='" + name + '\'' +
                ", subPrototypeDemo=" + subPrototypeDemo +
                '}';
    }

    @Override
    protected PrototypeDemo clone() throws CloneNotSupportedException {

        PrototypeDemo prototypeDemo = (PrototypeDemo) super.clone();
        prototypeDemo.setSubPrototypeDemo(subPrototypeDemo.clone());
        return prototypeDemo;
    }
}
package com.azure.design.prototype;
/**
* 引用类
*/
public class SubPrototypeDemo implements Cloneable{


    private String subName;

    public SubPrototypeDemo(String subName) {
        this.subName = subName;
    }

    public String getSubName() {
        return subName;
    }

    public void setSubName(String subName) {
        this.subName = subName;
    }

    @Override
    public String toString() {
        return "SubPrototypeDemo{" +
                "subName='" + subName + '\'' +
                '}';
    }

    @Override
    protected SubPrototypeDemo clone() throws CloneNotSupportedException {
        return (SubPrototypeDemo) super.clone();
    }
}
package com.azure.design.prototype;
/**
*	克隆工厂类
*/
public class PrototypeFactory {

    // 使用 懒汉模式 创建一个 PrototypeDemo 对象
    private static PrototypeDemo prototypeDemo =
            new PrototypeDemo("原型",new SubPrototypeDemo("引用类"));

    /**
     *  对外暴露克隆的方法
     *  参数克隆对象名
     * @param name
     * @return
     */
    public static PrototypeDemo getCloneInstance(String name) throws CloneNotSupportedException {

        System.out.println("拷贝前" + prototypeDemo + "," + prototypeDemo.getSubPrototypeDemo());
        // 克咯对象
        PrototypeDemo subPrototypeDemo = prototypeDemo.clone();
        subPrototypeDemo.setName(name);
       // System.out.println("浅拷贝后" + subPrototypeDemo + "," + subPrototypeDemo.getSubPrototypeDemo());
        System.out.println("深拷贝后" + subPrototypeDemo + "," + subPrototypeDemo.getSubPrototypeDemo());
        return subPrototypeDemo;
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值