主要组成部分:抽象原型和具体原型类.
说明: 在Java中如果通过赋值语句来创建一个对象,则新对象和原来的对象同是一个引用用;Java已经帮我们提供了一种解决方法可以方使的克隆
类,这就是原型模式.
UML原理:
例子:
package com.prototype;
/**
*
* @Title: KeyPrototype.java
* @Description: 钥匙原型
* @author awfhome@163.com
* @date 2010-6-3
* @version V1.0
*/
public class KeyPrototype implements Cloneable{
private float length;
private float thick;
private String color;
@Override
protected Object clone() throws CloneNotSupportedException {
Object obj = super.clone();
return obj;
}
public float getLength() {
return length;
}
public void setLength(float length) {
this.length = length;
}
public float getThick() {
return thick;
}
public void setThick(float thick) {
this.thick = thick;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
}
package com.prototype;
/**
*
* @Title: CopperKey.java
* @Description: 铜钥匙
* @author awfhome@163.com
* @date 2010-6-3
* @version V1.0
*/
public class CopperKey extends KeyPrototype{
public CopperKey() {
setColor("黄色");
}
}
package com.prototype;
/**
*
* @Title: AluminiumKey.java
* @Description: 铝钥匙
* @author awfhome@163.com
* @date 2010-6-3
* @version V1.0
*/
public class AluminiumKey extends KeyPrototype{
public AluminiumKey() {
setColor("银色");
}
}
package com.prototype;
public class Client {
public static void main(String[] args) throws CloneNotSupportedException {
KeyPrototype copperKey = new CopperKey();
copperKey.setLength(3.1f);
copperKey.setThick(0.5f);
KeyPrototype aluminiumKey = (KeyPrototype)copperKey.clone();
aluminiumKey.setColor("银色");
System.out.println("铜钥匙的颜色: "+ copperKey.getColor());
System.out.println(copperKey.getLength());
System.out.println("银钥匙的颜色: " + aluminiumKey.getColor());
System.out.println(copperKey.getLength());
}
}
有关深度克隆例子:
package com.prototype2;
public class Dog{
private int legCounts;
public Dog(int lenCounts){
this.legCounts = lenCounts;
}
public void changeLegCounts(){
this.legCounts *=2;
}
@Override
public String toString(){
return Integer.toString(this.legCounts);
}
}
package com.prototype2;
public class DogClone implements Cloneable {
public int legCounts;
public Dog dog = new Dog(4);
@Override
protected Object clone() throws CloneNotSupportedException {
DogClone o = (DogClone)super.clone();
return o;
}
}
package com.prototype2;
public class Client {
public static void main(String[] args) throws CloneNotSupportedException{
DogClone dogClone = new DogClone();
dogClone.legCounts = 3;
System.out.println("原来的克隆狗的腿数量: " + dogClone.legCounts);
System.out.println("原来克隆的那条狗数量: " + dogClone.dog);
DogClone dogClone1 = (DogClone)dogClone.clone();
// System.out.println(dogClone.dog);
dogClone1.legCounts = 2;
Dog dog = dogClone1.dog;
dog.changeLegCounts();//改变数量*2
System.out.println("克隆后原来狗的腿的数量: " + dogClone.legCounts);
//这里变成了8这并不是我们想要的,我只是复制了表层信息
System.out.println("克隆后原来那条狗数量:" + dogClone.dog);
}
}
注意到最后打印,克隆后原来那条狗数量:8,所以Dog并没有真的被复制,可以这样做:
让Dog也实现Cloneable 同时改变DogClone的clone方法
package com.prototype2;
public class Dog implements Cloneable {
private int legCounts;
public Dog(int lenCounts){
this.legCounts = lenCounts;
}
public void changeLegCounts(){
this.legCounts *=2;
}
@Override
public String toString(){
return Integer.toString(this.legCounts);
}
@Override
protected Object clone() throws CloneNotSupportedException {
Dog o = (Dog)super.clone();
return o;
}
}
package com.prototype2;
public class DogClone implements Cloneable {
public int legCounts;
public Dog dog = new Dog(4);
@Override
protected Object clone() throws CloneNotSupportedException {
DogClone o = (DogClone)super.clone();
o.dog = (Dog)dog.clone();
return o;
}
}