关于“原型模式”的具体讲解请看笔者博客
《设计模式》第二部分 创建型设计模式 第6章 原型模式(A:C++实现)
此文是“原型模式”的Java实现。
原型模式的克隆分为浅克隆和深克隆,Java 中的 Object 类提供了浅克隆的 clone() 方法,具体原型类只要实现 Cloneable 接口就可实现对象的浅克隆,这里的 Cloneable 接口就是抽象原型类。其代码如下:
步骤一:具体原型类
package com;
public class ConcretePrototype implements Cloneable{
public ConcretePrototype()
{
System.out.println("具体原型创建成功!");
}
public Object clone() throws CloneNotSupportedException
{
System.out.println("具体原型复制成功!");
return (ConcretePrototype)super.clone();
}
}
步骤二:测试
package com;
public class Main {
public static void main(String[] args) throws CloneNotSupportedException {
ConcretePrototype obj1= new ConcretePrototype();
ConcretePrototype obj2 = (ConcretePrototype)obj1.clone();
System.out.println("obj1==obj2? " + (obj1==obj2));
}
}
结果如下所示:
为了进一步说明,再举一个例子吧。同一学校的“三好学生”奖状除了获奖人姓名不同,其他都相同,属于相似对象的复制,同样可以用原型模式创建,然后再做简单修改就可以了。图3所示是三好学生奖状生成器的结构图。
代码如下所示:
Citation.java
package com;
public class Citation implements Cloneable{
String name;
String info;
String college;
Citation(String name,String info,String college)
{
this.name=name;
this.info=info;
this.college=college;
System.out.println("奖状创建成功!");
}
void setName(String name)
{
this.name=name;
}
String getName()
{
return(this.name);
}
void display()
{
System.out.println(name+info+college);
}
public Object clone() throws CloneNotSupportedException
{
System.out.println("奖状拷贝成功!");
return (Citation)super.clone();
}
}
Main.java
package com;
public class Main {
public static void main(String[] args) throws CloneNotSupportedException {
Citation obj1=new Citation("张三","同学:在2016学年第一学期中表现优秀,被评为三好学生。","韶关学院");
obj1.display();
Citation obj2=(Citation) obj1.clone();
obj2.setName("李四");
obj2.display();
}
}