当时做实验的时候没有找到。。
通过给出一个原型对象来指明所要创建的对象的类型,然后通过复制这个原型对象的方法来创建出更多的同类型的对象。
UML示意图
本实例UML图:
解析:
原型模式主要用于对象的复制,它的核心是就是类图中的原型类Prototype。Prototype类需要具备以下两个条件:
实现Cloneable接口。在java语言有一个Cloneable接口,它的作用只有一个,就是在运行时通知虚拟机可以安全地在实现了此接口的类上使用clone方法。在java虚拟机中,只有实现了这个接口的类才可以被拷贝,否则在运行时会抛出CloneNotSupportedException异常。
重写Object类中的clone方法。Java中,所有类的父类都是Object类,Object类中有一个clone方法,作用是返回对象的一个拷贝,但是其作用域protected类型的,一般的类无法调用,因此,Prototype类需要将clone方法的作用域修改为public类型。
原型模式是一种比较简单的模式,也非常容易理解,实现一个接口,重写一个方法即完成了原型模式。在实际应用中,原型模式很少单独出现。经常与其他模式混用,他的原型类Prototype也常用抽象类来替代。
实现代码:
packagedesign.shiyan2;
/**
* Created by 26522 on 2017/12/6.
*/
public classJuXing implements Cloneable {
private int a1,a2,d1,d2;
private int width,length;
public void setA1(int a1) {
this.a1 = a1;
}
public void setA2(int a2) {
this.a2 = a2;
}
public void setD1(int d1) {
this.d1 = d1;
}
public void setD2(int d2) {
this.d2 = d2;
}
public int getWidth(){
return Math.abs(d2-a2);
}
public int getLength(){
return Math.abs(d1-a1);
}
public int getArea(){
return Math.abs(d2-a2)*Math.abs(d1-a1);
}
public Object clone(){
Object obj=null;
try {
obj=super.clone();
return obj;
} catch (CloneNotSupportedException e){
System.out.println("不能复制");
return null;
}
}
}
packagedesign.shiyan2;
/**
* Created by 26522 on 2017/12/6.
*/
public classClient {
public static void main(String[] args) {
JuXing oldJx=new JuXing();
oldJx.setA1(1);
oldJx.setA2(2);
oldJx.setD1(3);
oldJx.setD2(5);
System.out.println("初始矩形!!!!!!:::::");
System.out.print("长:"+oldJx.getLength()+"");
System.out.println("宽:"+oldJx.getWidth());
System.out.println("面积:"+oldJx.getArea());
JuXing newJx;
newJx=(JuXing)oldJx.clone();
newJx.setA1(10);
System.out.println("改变一个顶点横坐标的矩形:::");
System.out.print("长:"+newJx.getLength()+"");
System.out.println("宽:"+newJx.getWidth());
System.out.println("面积"+newJx.getArea());
}
}
四、实验结果