chvnetcom 2019-10-29
1,定义:用已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象
2,原型的主要角色
抽象原型类:规定了具体原型对象必须实现的接口
具体原型类:实现抽象原型类的clone()方法,它是可被复制的对象。
访问类:使用具体原型类中的clone()方法,来复制新的对象
3,实现
原型的克隆分为浅克隆和深克隆,java的object类提供了浅克隆的clone()方法,具体原型类只要实现Cloneable接口就可以实现对象的浅克隆
//具体原型类 class Realizetype implement 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 o1 = new Realizetype(); Realizetype o2 = (Realizetype)o1.clone(); System.out.println(o1==o2);//false } }
public class ProtoTypeCitation { public static void main(String[] args) throws CloneNotSupportedException { citation obj1=new citation("张三","同学:在2016学年第一学期中表现优秀,被评为三好学生。","韶关学院"); obj1.display(); citation obj2=(citation) obj1.clone(); obj2.setName("李四"); obj2.display(); } } //奖状类 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(); } }
运行结果: 奖状创建成功! 张三同学:在2016学年第一学期中表现优秀,被评为三好学生。韶关学院 奖状拷贝成功! 李四同学:在2016学年第一学期中表现优秀,被评为三好学生。韶关学院
4,应用场景
对象之间相同或相似,即只是极个别的几个属性不同的时候
对象的创建过程比较麻烦,但是复制比较简单的时候
5,扩展
原型模式可扩展为带原型管理器的原型模式,它在原型模式的基础上增加了一个原型管理器 PrototypeManager 类。该类用 HashMap 保存多个复制的原型,Client 类可以通过管理器的 get(String id) 方法从中获取复制的原型。其结构图如图 5 所示。
例如:用带原型管理器的原型模式来生成包含“圆”和“正方形”等图形的原型,并计算其面积
import java.util.*; interface Shape extends Cloneable { public Object clone(); //拷贝 public void countArea(); //计算面积 } class Circle implements Shape { public Object clone() { Circle w=null; try { w=(Circle)super.clone(); } catch(CloneNotSupportedException e) { System.out.println("拷贝圆失败!"); } return w; } public void countArea() { int r=0; System.out.print("这是一个圆,请输入圆的半径:"); Scanner input=new Scanner(System.in); r=input.nextInt(); System.out.println("该圆的面积="+3.1415*r*r+"\n"); } } class Square implements Shape { public Object clone() { Square b=null; try { b=(Square)super.clone(); } catch(CloneNotSupportedException e) { System.out.println("拷贝正方形失败!"); } return b; } public void countArea() { int a=0; System.out.print("这是一个正方形,请输入它的边长:"); Scanner input=new Scanner(System.in); a=input.nextInt(); System.out.println("该正方形的面积="+a*a+"\n"); } } class ProtoTypeManager { private HashMap<String, Shape>ht=new HashMap<String,Shape>(); public ProtoTypeManager() { ht.put("Circle",new Circle()); ht.put("Square",new Square()); } public void addshape(String key,Shape obj) { ht.put(key,obj); } public Shape getShape(String key) { Shape temp=ht.get(key); return (Shape) temp.clone(); } } public class ProtoTypeShape { public static void main(String[] args) { ProtoTypeManager pm=new ProtoTypeManager(); Shape obj1=(Circle)pm.getShape("Circle"); obj1.countArea(); Shape obj2=(Shape)pm.getShape("Square"); obj2.countArea(); } }