2.原型模式(Prototype)

前言

        在有些系统中,存在大量相同或者相似对象的创建问题,如果用传统的构造函数来创建对象,复杂且耗资源,而用原型模式生成对象就比较高效。

定义:

        用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同的或者相似的新对象。原型实例指定了要创建的对象的种类。用这种方式创建对象非常高效,根本无须知道对象创建的细节。

特点:

优点: 

  • 性能提高。
  • 逃避构造函数的约束。
  • 向客户隐藏制造新实例的复杂性。
  • 动态增加和减少产品类

缺点: 

1、需要为每一个类配备一个克隆方法,而且配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类不是很难,但对于已有的类不一定很容易,特别当一个类引用不支持串行化的间接对象,或者引用含有循环结构的时候。

2、必须实现 Cloneable 接口。

主要角色:

1、抽象原型类:规定了具体原型对象必须实现的接口

2、具体原型类:实现抽象原型类的clone()方法,它是可被复制的对象

3、访问类:使用具体原型类中的clone()方法来复制新的对象

结构:

实现:

使用原型模式克隆对象时,根据其成员对象是否也克隆,原型模式的克隆分为浅克隆和深克隆。

//原型接口

interface Cloneable{

public Object clone();

}

//抽象原型类

abstract class AbstractType : Cloneable{

public Object clone() {

Object clone = null;

try{

clone =super.clone();//复制原型实例;

}catch(CloneNotSupportedException e) { e.printStackTrace();

}

return clone ;

}

}

//具体原型类

public class RealizeType : AbstractType {

public RealizeType(){

Console.WriteLine("具体原型创建成功!");

}

public Object clone() {

Console.WriteLine("具体原型复制成功!");

return (RealizeType )super.clone();;

} }

//原型模式的测试类

public class PrototypeTest{

public static void main(String[] args){

Realizetype obj1 = new Realizetype();

Realizetype obj2 = (Realizetype)obj1.clone();

Console.WriteLine("obj1 == obj2?" + (obj1==obj2));

}

}

应用场景:

1、对象之间相同或相似,即只是个别的几个属性不同的时候。

2、对象的创建过程比较麻烦,但是复制比较简单的时候。

3、在一个复杂的类层次中,当系统必须从其中的许多类型创建新对象时,可以考虑原型。

扩展:

原型模式可扩展为带原型管理器的原型模式,它在原型模式的基础上增加了一个原型管理器 PrototypeManager 类。

该类用 HashMap 保存多个复制的原型,Client 类可以通过管理器的 get(String id) 方法从中获取复制的原型。

浅克隆:被克隆对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象。

深克隆:把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象。

还有一点要考虑到的就是深复制的深度问题,如果对象引用的对象内,又包含了对其他对象的引用看,这样在深复制时要考虑复制多少层的问题,对于这种情况,可以通过序列化与反序列化的方式,来达到对象深复制的目的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值