------------------------------------原型模式-----------------------------------------
² 原型模式(Prototype Pattern):它是一种对象创建型模式,用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
² 模式动机:
有些系统(界面上一个图片,右击,复制到另外一个地方,一个对象就变成两个对象)里面涉及到对象的复制(克隆),这种情况下编程,有何套路?
在要复制的类里面编写一个克隆方法(clone(),该方法来源于Object,该方法属于Java特性,能够提供复制功能),实现复制。
所有的Java类都继承自java.lang.Object, 而Object类提供一个clone()方法,可以将一个Java对象复制一份。但是,这个Java类必须实现一个标识接口Cloneable,标识这个Java类支持复制。但是该方法不可靠:只能实现对象内值内容的克隆,无法实现引用类型的克隆,所以该方法叫做浅克隆,仅仅适合简单情况下克隆。果要实现真正的克隆,需要借助“深克隆”(Java中用读写流的方法)
² 优点:原型模式在很多软件都可以找到它的应用,如果实例化一个类要花大量时间,原型模式是最好的解决方案。
² 缺点:最主要缺点就是每一个类必须配备一个克隆方法。而且这个克隆方法需要对类的功能进行通盘考虑,这对全新的类来说不是很难,但对已有的类进行改造时,不一定是件容易的事。另一个缺点是在实现深克隆时需要编写较为复杂的代码。
实例1:浅克隆
----------------------------------------------------浅克隆的实现---------------------------------------------------------
class Word3 implements java.lang.Cloneable{//可以被克隆
String content;
String fontName;
String fontColor;
int fontSize;
public Word3(String content,String fontName,String fontColor,int fontSize){
this.content = content;
this.fontName = fontName;
this.fontColor = fontColor;
this.fontSize = fontSize;
}
/*要点:定义一个方法,通过clone来获得对象拷贝
这是业界推荐的方法。但是该方法有隐患,只能拷贝值对象,无法
拷贝引用对象
*/
public Word3 copy() throws Exception{
return (Word3)this.clone();//快速克隆,只拷贝数据
}
}
class Prototype3{
public static void main(String[] args) throws Exception{
Word3 w1 = new Word3("好","黑体","蓝色",50);
Word3 w2 = w1.copy();//克隆
System.out.println("W1的内容是:" + w1.content);
System.out.println("W2的内容是:" + w2.content);
w1.content = "坏";
System.out.println("W2的内容是:" + w2.content);
}
}
--------------------------------------------深度克隆的实现-----------------------------------------------------
class Font implements java.io.Serializable{
String fontName;
String fontColor;
int fontSize;
public Font(String fontName,String fontColor,int fontSize){
this.fontColor = fontColor;
this.fontName = fontName;
this.fontSize = fontSize;
}
}
/*单纯克隆叫做浅克隆,无法复制引用对象,如果要实现全面克隆
用深克隆:将对象写入流中,然后取出*/
class Word4 implements java.io.Serializable{
String content;
Font font;//引用对象
public Word4(String content,Font font){
this.content = content;
this.font = font;
}
public Word4 copy() throws Exception{ //深克隆
ByteArrayOutputStream baos =
new ByteArrayOutputStream();
ObjectOutputStream oos =
new ObjectOutputStream(baos);
oos.writeObject(this);
ByteArrayInputStream bais =
new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois =
new ObjectInputStream(bais);
return (Word4)ois.readObject();
}
}
class Prototype4{
public static void main(String[] args) throws Exception{
Word4 w1 = new Word4("好",new Font("黑体","蓝色",50));
Word4 w2 = w1.copy();//克隆
System.out.println("W1的字体是:" + w1.font.fontName);
System.out.println("W2的字体是:" + w2.font.fontName);
w1.font.fontName = "宋体";
System.out.println("w1改后W2的字体是:" + w2.font.fontName);
}
}