原型模式

------------------------------------原型模式-----------------------------------------

²  原型模式(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);             

              }

       }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值