原型模式

原型模式

 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

一 、 概述

    原型模式是从一个对象出发得到一个和自己有相同状态的新对象的成熟模式,该模式的关键是将一个对象定义为原型,并为其提供复制自己的方法。

二、原型模式的结构与使用 

模式的结构中包括两种角色:

抽象原型( Prototype
具体原型( Concrete Prototype
三、模式的UML类图

1.抽象原型(Prototype:Prototype.java

public interface  Prototype {

   public Object cloneMe() throwsCloneNotSupportedException,;

}

2.具体原型(Concrete Prototype_1:Cubic.java

public class Cubic implements Prototype, Cloneable{

      double  length,width,height;

      Cubic(double a,doubleb,double c){

            length=a;

            width=b;

            height=c;

      }

      public Object cloneMe() throws CloneNotSupportedException{

            Cubicobject=(Cubic)clone();

            returnobject;

      }

}

2.具体原型(Concrete Prototype_2:Goat.java

import java.io.*;

public class Goat implements Prototype,Serializable{

       StringBuffer color;

       public void setColor(StringBuffer c){

             color=c;

      }

      public  StringBuffergetColor(){

            returncolor;

      }

      public Object cloneMe() throws CloneNotSupportedException{

            Object object=null;

            try{

                   ByteArrayOutputStreamoutOne=newByteArrayOutputStream();

                   ObjectOutputStreamoutTwo=newObjectOutputStream(outOne);

                   outTwo.writeObject(this);    

                   ByteArrayInputStream inOne=

                   new ByteArrayInputStream(outOne.toByteArray());

                   ObjectInputStreaminTwo=newObjectInputStream(inOne);

                  object=inTwo.readObject(); 

           }

          catch(Exception event){

                   System.out.println(event);

           }

           returnobject;

      }

}

3.应用 Application.java

public classApplication{

    public static void main(String args[]){

         Cubic cubic=new Cubic(12,20,66);

         System.out.println("cubic的长、宽和高:");

         System.out.println(cubic.length+","+cubic.width+","+cubic.height);

         try{

                Cubic  cubicCopy=(Cubic)cubic.cloneMe();

                System.out.println("cubicCopy的长、宽和高:");

                System.out.println(cubicCopy.length+","+cubicCopy.width+","

                +cubicCopy.height);

         }

         catch(CloneNotSupportedException exp){}

         Goat goat=new Goat();

         goat.setColor(newStringBuffer("白颜色的山羊"));

         System.out.println("goat"+goat.getColor());

          try{

                 Goat  goatCopy=(Goat)goat.cloneMe();

                 System.out.println("goatCopy"+goatCopy.getColor());

                 System.out.println("goatCopy将自己的颜色改变成黑色");

                 goatCopy.setColor(newStringBuffer("黑颜色的山羊"));

                 System.out.println("goat仍然是"+goat.getColor());

                 System.out.println("goatCopy"+goatCopy.getColor());

          }

          catch(CloneNotSupportedException exp){}

    }

}

三、原型模式的优点 

当创建类的新实例的代价更大时,使用原型模式复制一个已有的实例可以提高创建新实例的效率。
可以动态地保存当前对象的状态。在运行时刻,可以随时使用对象流保存当前对象的一个复制品。
可以在运行时创建新的对象,而无须创建一系列类和继承结构。
可以动态地添加、删除原型的复制品。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值