设计模式课时十五------原型模式

原型模式是一种创建型设计模式,它提供了一种创建对象的等价副本,避免了直接构造新对象的过程。在Java中,实现原型模式需要实现Cloneable接口并覆盖clone()方法。克隆分为深拷贝和浅拷贝,深拷贝复制对象及其引用的对象,而浅拷贝只复制对象本身。由于复杂的对象结构,实现完全的深拷贝可能较为复杂。例如,Spoon.clone()涉及到Address对象的克隆,会形成如图所示的内存结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原型模式

定义:不通过构造函数的new来创建对象的副本

需要:被克隆的对象实现Cloneable接口,并重写父类的clone()方法,如果没有实现,则抛出CloneNotSupportedException异常

分类: 克隆又分为 深拷贝和浅拷贝
注:String对象每次克隆都是新对象,这也是为什么推荐用StringBuffer的缘故

/**
 * 原型模式-----对象克隆
 */
package Abstract.prototype;
class Person implements Cloneable
{
    public int age;
    public Person(int age)
    {
        this.age = age;
    }
}
class Address implements Cloneable
{
    public String address;
    public Address(String address)
    {
        this.address = address;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}
class Spoon implements Cloneable
{
    public String name ;
    public Person person;
    public Address address;

    @Override
    protected Spoon clone()
    {
        Spoon obj = null;
        try
        {
            obj = (Spoon)super.clone();
            /**
             * 如果想把对象Address、Person也克隆,需要加上这个
             * 如果当前类所引用的Person Address里面没有对象,那么加上以后就是深克隆,
             * 否则为伪深克隆,必须重写其内引用类的clone方法,以此类推
             * 如果不写,那么就仅仅复制的Address的引用,如果Address引用的类属性变化,那么副本也会随之变化
             */
//            obj.address = (Address) obj.address.clone();
        }
        catch (CloneNotSupportedException e)
        {
            System.out.println(" Object is not Cloneable ");
        }
        return obj;
    }

}

public class Demo1 {
    public static void main(String[] args) {
        Spoon spoon = new Spoon();
        spoon.person = new Person(18);
        Spoon spoon1 = (Spoon)spoon.clone();
        System.out.println(spoon);          //Abstract.prototype.Spoon@1b6d3586
        System.out.println(spoon1);         //Abstract.prototype.Spoon@4554617c
        System.out.println(spoon.person);   //Abstract.prototype.Person@74a14482
        System.out.println(spoon1.person);  //Abstract.prototype.Person@74a14482
        spoon.person.age = 38;
        System.out.println("spoon:"+spoon.person.age);//38
        System.out.println("spoon:"+spoon1.person.age);//38
    }
}

如图,如果Spoon.clone()方法包含Address的克隆,那么其内存结构如图:
在这里插入图片描述
所以要想实现彻底的深拷贝是非常困难的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值