设计模式之五:原型模式—对象的克隆

通过一个原型对象克隆出多个一模一样的对象,称为原型模式(Prototype Pattern)
克隆后的对象对原对象独立,对克隆后的对象进行修改不对原对象产生影响


一、原型模式概述

原型模式结构包含以下三个角色
  1. Prototype(抽象原型类):声明克隆方法的接口,是所有具体原型类的公共父类,可以是抽象类也可以是接口,甚至可以是具体实现类
  2. ConcretePrototype(具体原型类):实现在抽象类型中声明的克隆方法,在克隆方法中返回一个克隆对象
  3. Client类(客户类)

1)通用实现方法

创建新对象,将原对象参数传入
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;
    }
}

客户类中的使用:

    Prototype obj1=new ConcretePrototype();
    obj1.setAttr("sunny");
    Prototype obj2=obj1.clone()

2)Java语言提供的clone()方法

class ConcretePrototype implements Cloneable{
    ...
    public Prototype clone(){
        Object object=null;
        try{
            object=super.clone();
        }
        catch (CloneNotSupportedException exception){
            SYstem.err.println("Not support Cloneable");
        }
        return (Prototype)object;
    }
    ...
}
客户类中使用:

    Prototype obj1=new ConcretePrototype();
    Prototype obj2=obj1.clone()


二、完整解决方案:

public WeeklyLog clone(){
    Object obj=null;
    try{
        obj=super.clone();
        return (WeeklyLog)obj;
    }
    catch(CloneNotSupportException e){
        System.out.println("不支持复制");
        return null;
    }
}

三、浅克隆与深克隆

浅克隆与深克隆的区别在于是否支持对引用类型变量的复制
1、浅克隆:
原型对象的成员变量是值类型,将复制一份给克隆对象;如果原型对象的成员变量是引用类型,则将引用对象的地址复制一份给克隆对象
2、深克隆:
无论是值类型还是引用类型都讲复制一份给克隆对象

四、原型管理器的引入和实现

管理多个原型对象

五、原型模式的总结:
  1. 主要优点:
    1. 创建型对象较为复杂时,使用原型模式可以简化创建过程
    2. 扩展性较好
    3. 原型模式提供了简化的创建结构
    4. 可以使用深克隆的方式保存对象的状态
  2. 主要缺点:
    1. 需要为每一个类配备一个克隆方法,且位于一个类的内部,违反了开闭原则
    2. 代码复杂
  3. 适用场景
    1. 创建型对象成本较大
    2. 如果系统要保存对象的状态而对象的状态变换很小
    3. 需要避免适用分层次的工厂类来创建分层次的对象,并且类的实力对象只有一个或很少的几个组合状态,通过复制原型对象得到新实例可能比适用构造函数创建一个新实
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值