免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2632 | 回复: 0

Prototype原型模式 [复制链接]

论坛徽章:
0
发表于 2010-01-07 12:54 |显示全部楼层
1.为什么需要Prototype模式?
  引入原型模式的本质在于利用已有的一个原型对象,快速的生成和原型对象一样的实例。你有一个A的实例a:A a = new A();现在你想生成和a一样的一个实例b,按照原型模式,应该是这样:A b = a.Clone();而不是重新再new一个A对象。通过上面这句话就可以得到一个和a一样的实例,确切的说,应该是它们的数据成员是一样的。Prototype模式同样是返回了一个A对象而没有使用new操作。

2. 什么是 深克隆(深拷贝) 和 浅克隆(浅拷贝)
  浅克隆只克隆地址,不可克隆地址指向的东西,因此浅克隆经常使得两个对象使用同一个地址
  而深克隆则可以从地址中找到内容并克隆出来,再将其放到另个地址中以实现克隆与被克隆对象之间不存在共用地址的情况
  举个例子:
    String s1= "this is Prototype";
   String s2 = s1 ;  //字符串的 浅克隆 ,只是克隆的地址 并没有创建新的对象 。
    String s3 = String.copyValueOf(s1.toCharArray(), 0, s1.length()); //字符串的 深克隆 ,创建了新的对象 。
  
3. prototype设计模式需要的是深克隆。
  深克隆要求:
  1)为了获取对象的一份拷贝,我们可以利用Object类的clone()方法。
  2)在派生类中覆盖基类的clone()方法,并声明为public。
  3)在派生类的clone()方法中,调用super.clone()。
  4)在派生类中实现Cloneable接口。

4. 明白了克隆 ,那为什么要使用原型模式 ?
  举个例子,我们写了一本书,如果销售的好,还需要1万本,我们可以怎么做?是重新一本本地写(相当于再一个个new完,然后一个个设置属性),还是 直接拿复印机复制(相当于clone())?答案显而易见。

5. 如何使用?
  以勺子为例
  //原型接口
  public abstract class AbstractSpoon implements Cloneable
  {
    String spoonName;
    public void setSpoonName(String spoonName)
     {
      this.spoonName = spoonName;
     }
    public String getSpoonName()
     {
      return this.spoonName;
     }
    public Object clone()
    {
     Object object = null;
    try
    {
     object = super.clone();
    }
    catch (CloneNotSupportedException exception)
    {
     System.err.println("AbstractSpoon is not Cloneable");
    }
     return object;
    }
  }
//具体实现
  public class SaladSpoon extends AbstractSpoon
  {
   public SaladSpoon()
   {
    setSpoonName("Salad Spoon");
   }
  }
//测试类
  public class Test {
    public static void main(String[] agrs) {
      AbstractSpoon sp1 = new SaladSpoon();
      sp1.setSpoonName("new Salad Spoon");
      AbstractSpoon sp2 = (AbstractSpoon)sp1.clone();
      AbstractSpoon sp3 = (AbstractSpoon)sp1.clone();
      
      System.out.println("sp1 name = "+sp1.getSpoonName());
      System.out.println("sp2 name = "+sp2.getSpoonName());
      System.out.println("sp3 name = "+sp3.getSpoonName());
    }
  }
  结果是:
  sp1 name = new Salad Spoon
  sp2 name = new Salad Spoon
  sp3 name = new Salad Spoon
  通过克隆,从sp1创建了和sp1一样的两个新的对象
6. Prototype模式的优点包括:
  1)Prototype模式允许动态增加或减少产品类。由于创建产品类实例的方法是产批类内部具有的,因此增加新产品对整个结构没有影响。
  2)Prototype模式提供了简化的创建结构。工厂方法模式常常需要有一个与产品类等级结构相同的等级结构,而Prototype模式就不需要这样。
  3)Portotype模式具有给一个应用软件动态加载新功能的能力。由于Prototype的独立性较高,可以很容易动态加载新功能而不影响老系统。
  4)产品类不需要非得有任何事先确定的等级结构,因为Prototype模式适用于任何的等级结构。

7. Prototype模式的缺点:
  Prototype模式的最主要缺点就是每一个类必须配备一个克隆方法。而且这个克隆方法需要对类的功能进行通盘考虑,这对全新的类来说不是很难,但对已有的类进行改造时,不一定是件容易的事。
  简单一句话,原型模式就是 “克隆人”


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/67175/showart_2142997.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP