原型模式是一种对象创建型模式
用原型实例指定创建对象的种类并且通过复制这些原型创建新的对象。
原型模式允许一个对象再创建另外一个可定制的对象无须知道任何创建的细节。
原型模式的基本工作原理是通过将一个原型对象传给那个要发动创建的对象
,这个要发动创建的对象通过请求原型对象拷贝原型自己来实现创建过程。
原型模式包含三个角色,
抽象原型类:定义具有克隆自己的方法的接口
具体原型类:实现具体的克隆方法,在克隆方法中返回自己的一个克隆对象
让一个原型克隆自身从而创建一个新的对象
客户类:只需要直接实例化一个对象,再通过调用该对象的克隆方法复制得到多个相同的对象。
父类原型 Product
package org.test.design.protype;
public class Product implements Cloneable{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Object copy(){
try {
return super.clone();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
具体子类 ProductA
package org.test.design.protype;
public class ProductA extends Product{
public ProductA(){}
public ProductA(String name){
super.setName(name);
}
public void myFunction(){
System.out.println("ProductA myFunction");
}
}
客户端调用 测试:
package org.test.design.protype;
public class TestMain {
/**
* @param args
*/
public static void main(String[] args) {
Product pa=new ProductA("aaa");
System.out.println(pa.getName());
Product pa_copy1=(Product)pa.copy();
System.out.println(pa_copy1.getName()+"--"+(pa==pa_copy1));
Product pa_copy2=(Product)pa.copy();
System.out.println(pa_copy2.getName()+"--"+(pa==pa_copy2));
System.out.println("----------------");
//要明白克隆对象的含义,想下面的创建对象,其实并没有创建,对象b和c都是和a有相同的引用,
//也就是说在内存中只有一个对象a是存在的。
Product a=new ProductA("aaa");
System.out.println("a--"+a.hashCode());
Product b=a;
System.out.println("b--"+b.hashCode());
System.out.println(a==b);
Product c=new Product();
c=a;
System.out.println("c--"+c.hashCode());
System.out.println(a==c);
}
}
/*打印
aaa
aaa--false
aaa--false
----------------
a--6413875
b--6413875
true
c--6413875
true
*/
原型模式在我看来就是对象的拷贝,并且拷贝的对象的类型是定义好的父类,
这个父类就是这一类对象的一个原型。也就是说拷贝的对象都是上转型对象,
只保留了从父类继承的属性和方法,和单纯的拷贝不同,它在拷贝的时候
因为是上转型对象,所以把现有对象的私有属性和方法过滤,是对象回归到父类原型。