原型模式:
原型模式:
-
简单介绍:原型是一种创建型设计模式,使你能够复制已有对象,而又无需使代码依赖它们所属的类 最常见的一种就是克隆羊的问题 最简单的方式就是创建一个新的对象遍历原始对象的所有域,并将域值复制到新对象中。 但是这样的方式不一定时常常可行的 第一点就是属性不一定就是共有的 第二点就是必须知道对象所属的类 才能创建复制的对象 这时候 使用原型模式就能很好的解决这样的问题。
-
代码实现:Java中实现Clone接口 进行克隆
package cn.edu.designModel.prototype; import java.io.ObjectOutputStream; public class Sheep implements Cloneable { private String name; private int age; private String color; private Sheep friend; public Sheep() { } public Sheep(String name, int age, String color, Sheep friend) { this.name = name; this.age = age; this.color = color; this.friend = friend; } public Sheep getFriend() { return friend; } public void setFriend(Sheep friend) { this.friend = friend; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getColor() { return color; } public void setColor(String color) { this.color = color; } @Override public String toString() { return "Sheep{" + "name='" + name + '\'' + ", age=" + age + ", color='" + color + '\'' + ", friend=" + friend + '}'; } @Override protected Sheep clone() { // 这里使用的是浅拷贝 的方式进行clone 可以使用序列化的方式 实现深拷贝(这里不再详述) // 使用浅拷贝 默认的就是 基本数据类型 和 字符串就是将值复制一份 但是对于引用类型就是将对象的引用复制一份 但是指向的是同一个对象 // String类型的特殊性:String类型的不可变问题 是一个常量 导致会clone出一个新的对象 Sheep sheep = null; try { sheep = (Sheep) super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return sheep; } public static void main(String[] args) throws IllegalAccessException, InstantiationException { Sheep sheep = new Sheep("1", 22, "heise", new Sheep()); Sheep sheep2 = (Sheep)sheep.clone();// 实现克隆 } }
-
原型模式在Spring源码中的使用:创建bean 的时候指定scope 为prototype
-
原型模式的注意事项和细节
- 创建新的对象比较复杂时,可以利用原型模式简化对象的创建过程,同时也能够提高效率
- 不用重新初始化对象,而是动态地获得对象运行时的状态
- 如果原始对象发生变化(增加或者减少属性),其它克隆对象的也会发生相应的变化,无需修改代码
- 在实现深克隆的时候可能需要比较复杂的代码
- 缺点:需要为每一个类配备一个克隆方法,这对全新的类来说不是很难,但对已有的类进行改造时,需要修改 其源代码,违背了 ocp 原则