十、设计模式(4)原型模式(Prototype)

本文深入解析了原型模式,一种用于创建对象的设计模式。通过实现Cloneable接口并重写clone方法,原型模式能有效复制对象,特别适用于创建过程复杂或资源消耗大的对象。文章包括了原型模式的实现代码、优缺点分析及适用场景。

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

源文作者:

作者:朱小厮 
来源:优快云 
原文:https://blog.youkuaiyun.com/u013256816/article/details/50975438 



原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

一、举例

1.原型(实际上是implements了Cloneable接口,进而重写clone()方法)

public class ProtoType implements Cloneable
{
    private String name;

    @Override
    public ProtoType clone()
    {
        try
        {
            return (ProtoType)super.clone();
        }
        catch (CloneNotSupportedException e)
        {
            e.printStackTrace();
        }
        return null;
    }

    public String getName()
    {
        return name;
    }

    public void setName(String name)
    {
        this.name = name;
    }
}

2.测试代码

public class MainTest
{
    public static void main(String[] args)
    {
        ProtoType pt1 = new ProtoType();
        pt1.setName("protoType_1");
        ProtoType pt2 = pt1.clone();
        System.out.println(pt1 == pt2);
        System.out.println(pt1.getClass() == pt2.getClass());
        pt2.setName("protoType_2");
        System.out.println(pt1.getName()+" "+pt2.getName());
    }
}

输出:

false

true

protoType_1 protoType_2

二、注意

克隆还分为浅克隆和深克隆,细节这里就不赘述了。在《Effective Java》中作者提出了“谨慎地覆盖clone”,文中提出了Cloneable的许多问题,建议使用拷贝构造器的方法来替换Cloneable.

如果成员变量中存在引用数据类型, 需深克隆

三、优缺点

优点:

  1. 如果创建新的对象比较复杂时,可以利用原型模式简化对象的创建过程,同时也能够提高效率。
  2. 可以使用深克隆保持对象的状态。
  3. 原型模式提供了简化的创建结构。

缺点:

  1. 在实现深克隆的时候可能需要比较复杂的代码。
  2. 需要为每一个类配备一个克隆方法,而且这个克隆方法需要对类的功能进行通盘考虑,这对全新的类来说不是很难,但对已有的类进行改造时,不一定是件容易的事,必须修改其源代码,违背了“开闭原则”。

四、适用场景

  1. 如果创建新对象成本较大,我们可以利用已有的对象进行复制来获得。
  2. 如果系统要保存对象的状态,而对象的状态变化很小,或者对象本身占内存不大的时候,也可以使用原型模式配合备忘录模式来应用。相反,如果对象的状态变化很大,或者对象占用的内存很大,那么采用状态模式会比原型模式更好。
  3. 需要避免使用分层次的工厂类来创建分层次的对象,并且类的实例对象只有一个或很少的几个组合状态,通过复制原型对象得到新实例可能比使用构造函数创建一个新实例更加方便。

五、Jdk中的原型模式

java.lang.Object#clone()
java.lang.Cloneable

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值