意图
使用原型实例指定要创建对象的类型,通过复制这个原型来创建新对象。
类图
classDiagram
class Prototype {
<<abstract>>
+myClone()* Prototype
}
class ConcretePrototype {
-filed String
+myClone() Prototype
}
class Client
Prototype <|-- ConcretePrototype
Client ..> Prototype : 克隆
实现
public abstract class Prototype {
abstract Prototype myClone();
}
public class ConcretePrototype extends Prototype {
private String filed;
public ConcretePrototype(String filed) {
this.filed = filed;
}
@Override
Prototype myClone() {
return new ConcretePrototype(filed);
}
@Override
public String toString() {
return filed;
}
}
public class Client {
public static void main(String[] args) {
Prototype prototype = new ConcretePrototype("abc");
Prototype clone = prototype.myClone();
System.out.println(clone.toString());
}
}
输出:
abc
JDK 中的应用
java.lang.Object#clone()java.util.ArrayList、HashMap等集合的clone()方法(浅拷贝实现)
浅拷贝与深拷贝
原型模式的核心问题是拷贝的深浅,这在 HashMap 源码解析等集合源码中也会遇到:
- 浅拷贝:只复制对象本身和基本类型字段,引用类型字段仍指向同一对象。
Object#clone()默认即浅拷贝 - 深拷贝:引用类型字段也递归复制,新旧对象完全独立。通常需要重写
clone()或通过序列化实现
总结
读完之后问自己下面几个问题,直到可以流利地回答:
- 使用的场景?
- 本质是什么?
- 它解决了什么问题?
- 它体现了设计模式中什么原则?
- 存在的缺陷?
- 你认为与它相关的设计模式有哪些?它们之间的区别有哪些?
- 开源架构中哪些使用了这一模式?
系列导航
- 上一篇:生成器(Builder)
- 下一篇:单例模式(Singleton)