0


原型模式(Prototype Pattern)

原型模式(Prototype Pattern)

原型模式是一种 创建型设计模式,通过复制现有的实例来创建新的对象,而不是通过实例化(

new

)来创建,从而提高性能。


原理

  1. 核心思想:提供一个现有对象的模板,通过克隆来创建新的对象。
  2. 适用场景:当对象的创建成本较高,且需要多个类似的对象时,使用原型模式可以提高效率。
  3. 参与角色: - Prototype(原型接口):定义克隆方法(通常为 clone())。- ConcretePrototype(具体原型类):实现克隆方法,负责实际对象的复制。- Client(客户端):通过调用克隆方法创建对象。

优点

  1. 性能高效:通过克隆对象避免了复杂的对象创建过程。
  2. 动态性强:可以在运行时动态创建对象,而不需要依赖具体类。
  3. 灵活性:对于复杂对象可以深拷贝,从而实现完全独立的复制。

缺点

  1. 实现复杂:需要实现深拷贝时,可能会引入额外的复杂性。
  2. 资源消耗:对于深拷贝,克隆过程可能涉及大量的递归或额外的代码。

示例代码

1. 定义原型接口
// 定义原型接口publicinterfacePrototypeextendsCloneable{Prototypeclone();}

2. 具体原型类
// 具体原型类publicclassConcretePrototypeimplementsPrototype{privateString name;publicConcretePrototype(String name){this.name = name;}// 实现克隆方法@OverridepublicPrototypeclone(){try{return(Prototype)super.clone();// 浅拷贝}catch(CloneNotSupportedException e){thrownewRuntimeException("Clone not supported", e);}}// Getter 和 SetterpublicStringgetName(){return name;}publicvoidsetName(String name){this.name = name;}@OverridepublicStringtoString(){return"ConcretePrototype{name='"+ name +"'}";}}

3. 客户端代码
publicclassPrototypeExample{publicstaticvoidmain(String[] args){// 创建一个原型对象ConcretePrototype prototype =newConcretePrototype("Original");// 克隆对象ConcretePrototype clone1 =(ConcretePrototype) prototype.clone();ConcretePrototype clone2 =(ConcretePrototype) prototype.clone();// 修改克隆对象
        clone1.setName("Clone 1");
        clone2.setName("Clone 2");// 打印结果System.out.println("Original: "+ prototype);System.out.println("Clone 1: "+ clone1);System.out.println("Clone 2: "+ clone2);}}

输出结果
Original: ConcretePrototype{name='Original'}
Clone 1: ConcretePrototype{name='Clone 1'}
Clone 2: ConcretePrototype{name='Clone 2'}

深拷贝和浅拷贝

  • 浅拷贝: - 复制对象时,只复制基本类型字段。- 对于引用类型字段,只复制引用地址(共享同一个引用对象)。
@OverridepublicPrototypeclone(){try{return(Prototype)super.clone();// 默认浅拷贝}catch(CloneNotSupportedException e){thrownewRuntimeException("Clone not supported", e);}}
  • 深拷贝: - 复制对象时,除了基本类型字段,还需要递归复制引用类型字段,确保拷贝对象完全独立。
@OverridepublicPrototypeclone(){try{ConcretePrototype cloned =(ConcretePrototype)super.clone();
        cloned.setReference(newReference(this.reference.getValue()));// 手动深拷贝return cloned;}catch(CloneNotSupportedException e){thrownewRuntimeException("Clone not supported", e);}}

使用场景

  1. 对象创建开销大: - 数据库连接对象、线程池对象。
  2. 重复对象相似度高: - 图形界面中的按钮、表单等 UI 元素。
  3. 需要动态创建类的实例: - 在运行时动态加载并复制类。

UML 类图

        +-------------------+
        |    Prototype      |
        +-------------------+
        |  + clone()        |
        +-------------------+
                ^
                |
        +-------------------+
        | ConcretePrototype |
        +-------------------+
        |  - name           |
        |  + clone()        |
        +-------------------+
                ^
                |
        +-------------------+
        |     Client        |
        +-------------------+

小结

  • 原型模式通过克隆对象来避免复杂对象的直接创建过程,提高了代码的灵活性和性能。
  • 使用时需特别注意 深拷贝浅拷贝 的实现,尤其是对象中包含引用类型时。
标签: 原型模式

本文转载自: https://blog.csdn.net/qq_35861084/article/details/143901739
版权归原作者 p-knowledge 所有, 如有侵权,请联系我们删除。

“原型模式(Prototype Pattern)”的评论:

还没有评论