一.名称
二.问题(为了解决什么问题)
创建新对象成本较大(如初始化需要占用较长的时间,占用太多的CPU资源或网络资源),新的对象可以通过原型模式对已有对象进行复制来获得,如果是相似对象,则可以对其成员变量稍作修改。
三.解决方案(主要体现在uml和核心代码上)
原型模式的核心在于如何实现克隆方法。
原型模式的简单程度仅次于单例模式和迭代器模式。正是由于简单,使用的场景才非常的多。
类图
代码略,非常简单
java中怎么实现原型模式
- 实现Cloneable接口
- 重写Object类中的clone方法
原型模式使用时的注意事项
- 构造函数不会被执行
- 分清浅拷贝与深拷贝(非常重要)
- clone和final是两个冤家,这两个属性相互冲突
- 原型模式可以与工厂方法结合
浅拷贝
在浅拷贝中,如果原型对象的成员变量是值类型,将复制一份给克隆对象,如果原型对象的成员变量是引用类型,则将引用对象的地址复制一份给克隆对象,也就是说原型对象和克隆对象的成员变量指向相同的内存地址。在java语言中,通过覆盖object的clone方法可以实现浅拷贝。
深拷贝
深拷贝是讲所有引用对象也复制一份给克隆对象。简单来讲,在深拷贝中,除了对象本身被复制外,对象所包含的所有成员变量也将被复制。在java语言中,如果要实现深克隆,可以通过序列化等方式来实现。
四.效果(有啥优缺点)
优点:
1. 性能优良
2. 逃避构造函数的约束
3. 在创建新的对象实例较为复杂时,使用原型模式可以简化对象的创建过程,通过复制一个已有实例可以提高新实例的创建效率。
缺点:
1. 在实现深克隆时需要编写较为复杂的代码,而且当对象之间存在多重的嵌套引用时,为了实现深克隆,每一层对象对应的类都必须支持深克隆,实现起来可能会比较麻烦。
常见案例
周报格式大同小异