原型模式用于创建重复对象的同时保持性能,该模式属于创建型设计模式,是创建对象的最佳实现方式。
-
为什么要使用原型模式?
-
提高性能:通过
new
的方式创建对象不能获取到对象运行时的状态,且new
复制给新对象并没有直接clone
的性能高。 - 逃避构造函数:原型模式生成的新对象可能是派生类。拷贝构造函数生成的新对象只能是它本身。
-
提高性能:通过
-
何时使用原型模式?
- 对象之间相同或相似,即只有个别几个属性不同的时候
- 对象的创建过程比较麻烦,但复制比较简单的时候
- 资源优化场景,在实际项目中,原型模式很少单独出现,一般和工厂方法模式一起出现,通过
clone
的方式创建一个对象,然后由工厂方法提供给调用者
具体原型类:实现抽象原型类的clone()
方法,它是可被复制的对象
原型模式实践
- 优点
- 简化对象的创建,提高性能,它可直接操作内存中的二进制流,特别是复制大对象,性能差别非常明显
- 缺点
- 实现原型模式的每个派生类都必须实现
Clone
接口
- 实现原型模式的每个派生类都必须实现
代码实现
package prototype;
import java.io.Serializable;
public class Person implements Serializable , Cloneable{
private String name;
public Person(String name) {
this.name = name;
}
public Person() {
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
'}';
}
@Override
public Person clone() {
try {
// TODO: copy mutable state here, so the clone can't change the internals of the original
return (Person) super.clone();
} catch (CloneNotSupportedException e) {
throw new AssertionError();
}
}
}
package prototype;
public class Client {
public static void main(String[] args) {
Person person = new Person("person1");
Person person1 = person.clone();
System.err.println("person == person1?" + (person == person1));
System.err.println(person1);
}
}
// 结果
person == person1false
Person{name='person1'}