声明:设计模式系列笔记摘自http://c.biancheng.net/view/1317.html
1、定义:用一个已经创建好的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象
2、原型模式包括以下主要角色:
a.抽象原型类:规定了具体原型类必须实现的接口。
b.具体原型类:实现了抽象原型类的clone()方法,它是可被复制的对象。
c.访问类:使用了具体原型类中的clone()方法复制新对象。
3.具体原型类例子:
class Realizetype implements Cloneable{
Realizetype(){
System.out.println("具体原型创建成功");
}
public Object clone() throws CloneNotSupportedException{
System.out.println("具体原型复制成功");
return (Realizetype)super.clone();
}
}
public class PrototypeTest {
public static void main(String[] args) throws CloneNotSupportedException {
Realizetype obj1 = new Realizetype();
Realizetype obj2 = (Realizetype) obj1.clone();
System.out.println("obj1==obj2?"+(obj1==obj2));
}
}
结果:
具体原型创建成功!
具体原型复制成功!
obj1==obj2?false
3.2具体原型类例子——奖状(除了名字外,其他属性相同,可以通过复制原型实现)
public class PrototypeCitaion{
public static void main(String[] args) throws CloneNotSupportedException {
Citation citaion = new Citation("张三","同学:在2016学年第一学期中表现优秀,被评为三好学生。","仲恺农业工程学院");
citaion.display();
Citation citation2 = (Citation) citaion.clone();
citation2.setName("李四");
citation2.display();
}
}
class Citation implements Cloneable{
private String name;
private String info;
private String college;
public Citation(String name, String info, String college) {
// TODO Auto-generated constructor stub
this.name = name;
this.info = info;
this.college = college;
System.out.println("奖状创建成功!");
}
public Object clone() throws CloneNotSupportedException{
System.out.println("奖状拷贝成功!");
return (Citation)super.clone();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void display(){
System.out.println(name+info+college);
}
}
4.应用场景:
a.对象相同或相似,只有个别属性不同
b.对象的创建过程复杂,但是复制过程比较简单的时候。