8、原型模式

原型模式是一种创建型设计模式,通过复制已有对象来创建相似的新对象。在Java中,可以使用`clone()`方法实现浅克隆,而深克隆通常结合序列化和反序列化来实现。此模式适用于创建新对象成本较高或需要保存对象状态的情况。
摘要由CSDN通过智能技术生成

原型模式

概述

原型模式:使用原型实例指定待创建对象的类型,并且通过复制这个原型来创建新的对象。

原型模式是一种对象创建型模式,将一个原型对象传给要发动创建的对象(即客户端对象),这个要发动创建的对象通过请求原型对象拷贝自己来实现创建过程。原型模式是一种特殊的创建型模式,它通过复制一个已有对象来获取更多相同或相似的对象。创建克隆对象的工厂就是原型类自身,工厂方法由克隆方法来实现。克隆方法创建的对象是全新的对象,在内存中拥有新的地址,对克隆产生的对象进行修改不会对原型对象造成影响。

结构

img

原型模式包含以下3个角色:

Prototype(抽象原型类):它是声明克隆方法的接口,是所有具体原型类的公共父类,它可以是抽象类也可以是接口,甚至还可以是具体实现类。

ConcretePrototype(具体原型类):它实现在抽象原型类中声明的克隆方法,在克隆方法中返回自己的一个克隆对象。

Client(客户类):让一个原型对象克隆自身从而创建一个新的对象,在客户类中只需要直接实例化或通过工厂方法等方式创建一个原型对象,再通过调用该对象的克隆方法即可得到多个相同的对象。由于客户类针对抽象原型类Prototype编程,因此用户可以根据需要选择具体原型类,系统具有较好的可扩展性,增加或更换具体原型类都很方便。

结构实现

浅克隆与深克隆

根据在复制原型对象的同时是否复制包含在原型对象中引用类型的成员变量,原型模式的克隆机制分为两种:浅克隆(Shallow Clone)和深克隆(Deep Clone)。

浅克隆

在浅克隆中,如果原型对象的成员变量是值类型,将复制一份给克隆对象;
如果原型对象的成员变量是引用类型,则将引用对象的地址复制一份给克隆对象,也就是说原型对象和克隆对象的成员变量指向相同的内存地址。
简单来说,在浅克隆中,当对象被复制时只复制它本身和其中包含的值类型的成员变量,而引用类型的成员对象并没有复制。

深克隆

无论原型对象的成员变量是值类型还是引用类型,都将复制一份给克隆对象,深克隆将原型对象的所有引用对象也复制一份给克隆对象。简单来说,在深克隆中,除了对象本身被复制外,对象所包含的所有成员变量也将复制。

实现

实现原型模式的关键在于如何实现克隆方法,下面介绍两种在Java语言中常用的克隆实现方法。

通用实现方法

通用的克隆实现方法是在具体原型类的克隆方法中实例化一个与自身类型相同的对象并将其返回,并将相关的参数传入新创建的对象中,保证它们的成员属性相同。

public abstract class Prototype{
   
    public abstract Prototype clone();
}

class ConcretePrototype implements Prototype{
   
	private String attr; //成员变量
    
    public void setAttr(String attr){
   
        this.attr = attr;
    }
    
    public String getAttr(){
   
        return this.attr;
    }
    
    //克隆方法
    public Prototype  clone(){
   
        Prototype prototype = new ConcretePrototype(); //创建新对象
        prototype.setAttr(this.attr);
        return prototype;
    }
}

在客户类中我们只需要创建一个ConcretePrototype对象作为原型对象,然后调用其clone()方法即可得到对应的克隆对象:

ConcretePrototype prototype = new ConcretePrototype();
prototype.setAttr("Sunny"
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值