原型模式
定义
在软件系统中,有时需要多次创建某一类型的对象,为了简化创建过程,可以只创建一个对象,然后通过对象克隆的方式复制出多个相同的对象,这就是原型设计模式。
原型设计模式是一种对象创建型模式,用原型实例指定创建对象的种类,并且通过复制这些原型创建新对象。原型设计模式允许一个对象再创建另一个可定制的对象,而不需要知道在创建的细节。
原型模式结构分析
1.Prototype(抽象原型类)
抽象原型类是定义具有克隆自己的方法的接口,是所有具体原型类的公共父类,可以是抽象类,也可以是接口
2.ConcretePrototype(具体原型类)
具体原型类实现了具体的克隆方法,在克隆方法中返回一个自己的克隆对象。
3.Client(测试类)
让原型对象克隆一个自己的对象,从而创建出一个新的对象,在测试类中只需要自己new一个对象或者通过工厂方法创建一个对象,然后在调用该对象的克隆方法就可以得到多个复制出来的对象。
下面我们看一个原型设计模式的实例
package clone;
//浅克隆
//浅克隆:只复制引用,但不复制引用的对象。这样clone出来的多个对象指向的是同一个对象。复制引用
public class Person implements Cloneable{
private int age;
private int length;
public Person(int age,int length) {
this.age = age;
this.length =length;
}
//抽象原型类object
public Object clone() {
try {
return (Person)super.clone();
} catch(Exception e) {
e.printStackTrace();
return null;
}
}
}
注意这一部分的代码的结果在测试类中没有给出输出
package clone;
public class Student implements Cloneable {
int age;
String name;
Student(int age,String name ){
this.age = age;
this.name =name;
}
//抽象原型类object
public Object clone() {
Student o =new Student(12,name);
try {
o = (Student)super.clone();
}catch(Exception e) {
e.printStackTrace();
}
return o;
}
}
测试类
package clone;
public class Test {
//private static final String leiyu = null;
public static void main(String[] args) {
// TODO 自动生成的方法存根
Person person1 =new Person(12,12);
Person person2 = (Person) person1.clone();
System.out.println(person1.getClass()==person2.getClass());
System.out.println(person1 == person2);
System.out.println(person1.toString());
System.out.println(person2.toString());
//Student s1 = new Student(12,leiyu);
//Student s2 = (Student) s1.clone();
//System.out.println(s1.getClass()==s2.getClass());
}
}
结果
关于clone方法的输出和测试
Java语言提供的clone()方法将对象复制一份返回给调用者。一般而言,clone()方法满足:
1.对任何的对象x,都有x.clone()!= x,即克隆的对象与原对象不是同一个对象。
2.对任何的对象x,都有x.clone().getclass()==x.getclass(),即克隆对象与原对象的类型一样。
3.如果对象x的equals()方法定义恰当,那么x.clone().equals(x)应该是成立的。
步骤归纳
为了获取对象的一份拷贝,我们可以利用Object类的clone()方法,具体步骤归纳如下:
1.在派生类中覆盖基类 的clone方法,并声明为public
2.在派生类中的clone()方法中返回super.clone()
3.在派生类中实现Cloneable接口
在Java语言中通过覆盖Object中的clone方法可以实现浅克隆,如果要实现深客隆,可以通过序列化等方式。
原型模式适合的情况
1.创建新对象的成本较大,新的对象可以通过原型模式对已有对象进行复制来获得。
2.系统要保存对象的状态,而对象的状态变化很小。