无名 发表于 2022-5-8 17:02:34

【LSP】原型模式


http://cdn.u1.huluxia.com/g4/M01/65/F7/rBAAdl91ZT2ADLCvAACt4WdlvYs715.jpg
序言:今天我们来聊一下原型模式,我个人认为原型模式的命名不太好理解,称呼其为克隆模式会更妥当一点。原型模式的目的是通过复制一个现有的对象来生成一个新的对象,而不是通过实例化的方法。

1|0原型模式的基本介绍
用已经创建的实例对象作为原型,通过复制对象来创建一个和原型相同的对象或相似的新对象

原型模式属于创建型模式,主要通过 Cloneable 接口去完成 对象的复制

http://cdn.u1.huluxia.com/g4/M01/65/F7/rBAAdl91ZT6AMXtsAABnKAULCbc697.jpg


在原型模式结构图中,会有这么几个角色

抽象原型角色(Prototype):是声明克隆方法的接口,是所有原型类的公共父类
具体原型角色(Realizetype):它实现在抽象原型类中所声明的克隆方法,在克隆方法中返回一个克隆对象
访问角色(PrototypeTest): 使用具体原型类中的 clone() 方法来复制新的对象


需要注意的点:

在 Java 中 能够克隆的 Java类 务必得 实现 Cloneable 接口,表示这个 类 能够被 “复制”,至于这个 复制的效果 则与我们的实现有关,通常 clone()方法满足以下的条件:

对任何的对象x,都有:x.clone()!=x 。换言之,克隆对象与元对象不是一个对象
对任何的对象x,都有:x.clone().getClass==x.getClass(),换言之,克隆对象与元对象的类型一样
对任何的对象x,如果 equals() 方法编写得当的话, 那么x.clone().equals(x)应该是成立的
在正式开始原型模式之前,我们先了解两个概念 浅克隆和深克隆,浅克隆和深克隆的主要区别在于是否支持引用类型的成员变量的复制



2|0原型模式(浅克隆)
在浅克隆中,如果原型对象的成员变量是值类型,将复制一份给克隆对象;如果原型对象的成员变量是引用类型,则将引用对象的地址 复制 一份给克隆对象,也就是说原型对象和克隆对象的成员变量指向 相同 的内存地址

下面我们以 花园和花 为案例

假设我们有一个花园,我们在花园里种植上好的牡丹花,有一天突然想照着牡丹园再建一个一模一样的园子,只是在花园中改种玫瑰http://cdn.u1.huluxia.com/g4/M01/65/F7/rBAAdl91ZT-AeNaIAAaWKs0UYQ8841.jpg
http://cdn.u1.huluxia.com/g4/M01/65/F7/rBAAdl91ZUCAMHAAAAHze3HyMgw523.jpg
页: [1]
查看完整版本: 【LSP】原型模式