`
liujianguangaaa
  • 浏览: 238495 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论
阅读更多

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

分享到:
评论

相关推荐

    C#视频-面向对象设计模式纵横谈(6):Prototype 原型模式(创建型模式)

    在本课程中,我们将深入探讨C#编程中的一个重要设计模式——Prototype原型模式,它是创建型设计模式的一种。原型模式主要用于简化实例化过程,通过复制已有对象来创建新对象,而不是直接通过构造函数来创建。这一...

    C#面向对象设计模式纵横谈\6 Prototype原型模式创建型模式.part1.rar

    在这里与各位分享本人从网络上下载的C#面向对象设计模式纵横谈系列视频,共有25节,除了第一节需要各位贡献一点资源分以作为对本人上传资源的回馈,后面的其他资源均不需要资源分。敬请期待。 这是第6节:Prototype...

    C#面向对象设计模式纵横谈\6 Prototype原型模式创建型模式.part2.rar

    在这里与各位分享本人从网络上下载的C#面向对象设计模式纵横谈系列视频,共有25节,除了第一节需要各位贡献一点资源分以作为对本人上传资源的回馈,后面的其他资源均不需要资源分。敬请期待。 这是第6节:Prototype...

    C#面向对象设计模式纵横谈(6):Prototype 原型模式(创建型模式)

    本篇文章将深入探讨C#中的“原型模式”(Prototype Pattern),这是一种创建型设计模式,它允许我们通过复制已有对象来创建新对象,而不是从零开始创建。 原型模式的核心思想是克隆。在C#中,对象的克隆可以通过...

    Java设计模式之Prototype原型模式

    Java设计模式之Prototype原型模式 Prototype原型模式是Java设计模式中的一种创建型模式,它主要用于对象的克隆和创建。该模式的主要思想是将一个对象作为原型,然后通过克隆该对象来创建新的对象,从而实现对象的...

    设计模式之Prototype(原型)

    "原型"(Prototype)设计模式是其中的一种,它的主要目标是通过复制现有的对象来创建新的对象,而不是通过构造函数来创建新实例。这种方法尤其适用于当创建新对象的过程复杂或者昂贵时,例如,当对象需要大量初始化...

    C#面向对象设计模式纵横谈(6):Prototype 原型模式(创建型模式) (Level 300)

    原型模式(Prototype Pattern)是一种创建型设计模式,它允许我们通过复制现有的对象来创建新对象,而无需知道具体创建过程的细节。在C#中,原型模式是通过接口或抽象类来实现的,通常涉及`ICloneable`接口或者...

    原型设计模式prototype

    **原型设计模式(Prototype Pattern)**是一种创建型设计模式,它允许我们通过复制现有的对象来创建新对象,而不是通过构造函数来实例化新对象。在面向对象编程中,当我们需要频繁地创建具有相同或相似属性的对象时,...

    设计模式 创建型模式 Prototype模式(原型)

    Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。...

    prototype原型模式

    原型模式是一种设计模式,属于创建型模式,它提供了一种创建对象的最佳方式。在原型模式中,一个对象可以在不创建新实例的情况下进行克隆,从而产生一个与原对象相同或几乎相同的新对象。这种模式主要涉及到`拷贝...

    Prototype模式

    **原型模式(Prototype Pattern)**是一种创建型设计模式,它提供了一种通过复制已有对象来创建新对象的方式,而不是通过构造函数。在某些情况下,当创建新对象的成本非常高时(例如,对象需要大量的初始化操作或者从...

    设计模式之Prototype

    "原型"(Prototype)模式是其中的一种行为设计模式,它主要用于简化对象的创建过程,通过复制已有对象来生成新对象,而非每次都创建一个新的实例。这种模式在需要大量相似对象时尤其有效,可以避免重复代码并提高...

    Prototype Pattern原型模式

    **原型模式(Prototype Pattern)**是一种基于克隆的创建型设计模式,它的主要目的是为了提高创建新对象的效率,特别是当创建新对象的过程复杂或者资源消耗较大时。在原型模式中,一个已经创建的对象(称为原型)被...

    解析设计模式中的Prototype原型模式及在C++中的使用

    原型模式的意图是用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 适用性  当要实例化的类是在运行时刻指定时,例如,通过动态装载;或者 为了避免创建一个与产品类层次平行的工厂类层次时;...

    设计模式C++学习之原型模式(Prototype)

    本篇文章将深入探讨“原型模式(Prototype)”这一经典的设计模式,它是面向对象设计的一个重要概念,尤其在C++编程中有着广泛的应用。 原型模式是一种创建型设计模式,它的核心思想是通过复制已有对象来创建新对象,...

    23种设计模式之Prototype模式代码

    **原型模式(Prototype模式)**是软件设计模式中的一个经典模式,属于创建型模式。它提供了一种通过复制现有的对象来创建新对象的方式,而无需知道具体创建过程的细节。这种模式在需要频繁创建相似对象时非常有用,...

    c++-设计模式之原型模式(Prototype Pattern)

    原型模式(Prototype Pattern)是一种创建型设计模式,允许通过复制现有对象来创建新对象,而不是通过类构造器。这种模式常用于需要频繁创建相似对象的场景,能够提高性能并减少内存使用。 原型模式的组成 原型接口...

    创建型模式之原型模式(Prototype Pattern)

    在软件设计中,原型模式是一种创建型设计模式,它提供了一种通过复制已有对象来创建新对象的方式,避免了重复的构造过程,提高了代码的效率和可维护性。原型模式的核心思想是利用对象的克隆功能来实现新对象的创建,...

    原型模式prototype

    **原型模式(Prototype)**是软件设计模式中的一种,它属于创建型模式,主要用于简化对象的创建过程,通过复制已有对象来生成新对象,避免了重复的构造过程,提高了代码的效率和可维护性。在Java、C#等面向对象语言...

Global site tag (gtag.js) - Google Analytics