浅谈设计模式:原型模式(Prototype Pattern)

热爱生活、享受娱乐、专注技术,欢迎关注QGer,我们一起见证成长!

什么是原型模式?

  官方解释: cloning of an existing object instead of creating new one and can also be customized as per the requirement.(克隆一个现有对象来代替新建一个对象,并且可以按定制要求克隆)
  • 通俗解释:通过新建一个原型对象(该对象实现一个具有克隆接口的抽象类、接口)指明要创建的类型,调用对象自身的克隆接口创建出更多的同类型对象。

为什么使用原型模式?

1、简化对象创建的过程,利用现有对象直接调用克隆方法实现对象的创建。

2、降低子类的需求。

3、客户获取对象时不需要知道哪一个类型的对象会呗创建。

4、可在运行时创建、销毁对象。

如何使用原型模式?

原型模式UML图如下:

  • 调用方:在已有一个原型对象的前提下,调用原型对象的克隆方法来获取(大量)同类型对象。
  • 原型接口:定义一个clone接口的抽象类(接口)。
  • 具体原型类:每一个原型类都要实现(继承)该接口,并实现接口的clone(克隆)方法。这里的clone必须是深克隆的,即在一些具有引用型对象(java的引用、c/c++的指针),必须将引用型对象所指的成员全部复制一遍,而不是仅仅将引用的地址复制一遍。

    这里讲到了深复制,为了让不懂这个概念的同学了解一下,那么就来科普一下深复制和浅复制的概念。

  • 浅复制:克隆类对象的时候,在类具有引用型成员对象时,仅仅将对象类中的引用性对象的地址复制一份到新的对象去,所以此时被克隆出来新的对象的应用型成员对象指向的还是和原来的对象一样。
  • 深复制:克隆类对象的时候,将类内部的引用型成员对象指向的成员也挨个复制一边赋值到新建的类对象中,并且此过程可嵌套,因为引用型成员对象指向的成员也可能具有引用型成员对象,因此在实现克隆的时候,需要考虑克隆的对象是否会出现这个嵌套的过程,再三注意,若嵌套过深造成克隆的性能过差,可考虑放弃使用原型模式(这种情况一般很少出现)。

    原型模式使用场景:

    • 当类需要在运行时进行实例化。
    • 当创建一个对象过于复杂和昂贵。
    • 当你想保持应用中类数量最小。
    • 当客户端(调用方)不想知道类的创建和表示。

应用实例:

听说过纳米机器人吗?现在有一种这样的纳米机器人,他们只要有足够的能量就能无限自我复制,在许多领域都有强大的作用,那么我们现在来抽象定义一个纳米机器人的原型。

  1. 首先肯定是:Prototype抽象类(接口)、该接口具有clone方法。在java中,Object对象具有clone接口,这个接口是声明为protected的,java本身所有类Object的子类,但是需要实现Cloneable接口后才能调用clone方法。因此,在java中Prototype这个接口可直接省略,直接用具体原型对象类实现Cloneable接口即可。题外话,这里的clone方法还是声明为native的,java中该关键字的意思是该声明的方法的实现使用非java代码实现的,详细细节可自行搜索哈。
  2. 接着定义具体的原型对象类(naroRobot)并实现原型接口(此处是Cloneable),重写clone方法,克隆的实现必须是深复制的,这里不纠结与深浅复制的实现,之后会有相关详细的介绍。
public class NaroRobot implements Cloneable {
    private String id;
    private String name;
    //……各种属性,为引用型成员时需要进行深复制
    public NaroRobot(String id, String name) {
        this.id = id;
        this.name = name;
    }
    @Override
    protected Object clone() throws CloneNotSupportedException {
        //此处假设该原型类没有引用型对象。
        return super.clone();
    }
}
  1. 最后是在现有一个naroRobot的情况下,调用对象的clone方法实现大规模纳米机器人的创建
public class Client {
    public static void main(String[] args) {
        NaroRobot naroRobot = new NaroRobot("007", "robot");
        List<NaroRobot> naroRobotList = new ArrayList<>();
        for (int i = 0; i < 100; ++i) {
            try {
                naroRobotList.add(naroRobot.clone());
            } catch (CloneNotSupportedException e) {
                e.printStackTrace();
            }
        }
    }
}
 PS:此处的原型接口也可不省略,在有多个同类的原型对象类时,可增加一个抽象类实现Cloneable接口,然后具体原型类再继承该类即可。
时间: 2024-11-25 08:22:52

浅谈设计模式:原型模式(Prototype Pattern)的相关文章

二十四种设计模式:原型模式(Prototype Pattern)

原型模式(Prototype Pattern) 介绍用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象. 示例有一个Message实体类,现在要克隆它. MessageModel using System; using System.Collections.Generic; using System.Text; namespace Pattern.Prototype { /// <summary> /// Message实体类 /// </summary> publi

谈谈设计模式~原型模式(Prototype)

返回目录 原型模式是创建型模式的一种,其特点在于通过“复制”一个已经存在的实例来返回新的实例(clone),而不是新建(new)实例.被复制的实例就是我们所称的“原型”,这个原型是可定制的. 原型模式多用于创建复杂的或者耗时的实例,因为这种情况下,复制一个已经存在的实例使程序运行更高效:或者创建值相等,只是命名不一样的同类数据. 从原型模式的概念中,我们可以看到,在这个模式里,拷贝是个很重要的概念,即在不创建对象的情况下,返回一个已有对象,这就是拷贝去实现的,在面向对象的编程世界里,拷贝分为浅拷

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

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! 概述 原型模式是一种创建型设计模式,它通过复制一个已经存在的实例来返回新的实例,而不是新建实例.被复制的实例就是我们所称的原型,这个原型是可定制的.原型模式多用于创建复杂的或者耗时的实例, 因为这种情况下,复制一个已经存在的实例可以使程序运行更高效,或者创建值相等,只是命名不一样的同类数据. 原型模式要求对象实现一个可以"克隆"自身的接口,这样就可以通过

Java设计模式四: 原型模式(Prototype Pattern)

网上找了好多这个模型的资料说的都不透彻,看了半天都是云里雾里.只好自己操刀研究一把. 原型模式是一种创建型设计模式,它通过复制一个已经存在的实例来返回新的实例,而不是新建实例.被复制的实例就是我们所称的原型,这个原型是可定制的.原型模式多用于创建复杂的或者耗时的实例, 因为这种情况下,复制一个已经存在的实例可以使程序运行更高效,或者创建值相等,只是命名不一样的同类数据. 原型模式中的拷贝分为"浅拷贝"和"深拷贝":浅拷贝: 对值类型的成员变量进行值的复制,对引用类型

[工作中的设计模式]原型模式prototype

一.模式解析 提起prototype,最近看多了js相关的内容,第一印象首先是js的原型 var Person=function(name){ this.name=name; } Person.prototype.run=function(){ alert(this.name+" is running"; } 此处的原型是js的特殊定义,在原型上定义的属性和方法所有的类进行共享. 不过设计模式中的原型模式指的是:将已有的对象作为原型,拷贝出一份具有相同属性的新的对象. 模式定义为:原型

java语言实现创建型设计模式—原型模式(Prototype)

一.描述 原型模式是通过一个原型对象来标明要创建的对象的类型,然后用复制这个原型对象的方法来拷贝创建更多的同类型对象.例如我们在程序的动态运行过程中有了一个对象,这个对象中包含了一系列的有效数据,我们此时需要一个和该对象完全相同的新对象,并且在拷贝之后,新旧对象之间没有任何联系,对任何一个对象的更改都不影响另一个对象. 在java中所有类都默认继承自java.lang.Object类,在这个Object类中有一个clone()方法,该方法将返回Object对象的一个拷贝. 我们让需要被拷贝的类实

原型模式(Prototype Pattern)

用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. 它通过复制一个已经存在的实例来返回新的实例,而不是新建实例.被复制的实例就是我们所称的原型,这个原型是可定制的. 原型模式多用于创建复杂的或者耗时的实例, 因为这种情况下,复制一个已经存在的实例可以使程序运行更高效,或者创建值相等,只是命名不一样的同类数据. 原型模式中的拷贝分为"浅拷贝"和"深拷贝":浅拷贝: 对值类型的成员变量进行值的复制,对引用类型的成员变量只复制引用,不复制引用的对象.深拷贝:

设计模式:原型模式(Prototype)

以前听过这样一句话:“程序员的最高境界就是Ctrl+C.Ctrl+V”,我们先不论这句话的对错,就论这个过程,这个过程我们都知道无非就是复制一个对象,然后将其不断地粘贴.这样的过程我们可以将其称之为“克隆”.再如我们应聘的时候打印了那么多的简历. 克隆我们都清楚,就是用一个物体复制若干个一模一样物体.同样,在面向对象系统中,我们同样可以利用克隆技术来克隆出若干个一模一样的对象.在应用程序中,有些对象比较复杂,其创建过程过于复杂,而且我们又需要频繁的利用该对象,如果这个时候我们按照常规思维new该

6.原型模式(Prototype Pattern)

using System; namespace ConsoleApplication5 { class Program { static void Main(string[] args) { // 孙悟空 原型 MonkeyKingPrototype prototypeMonkeyKing = new ConcretePrototype("MonkeyKing"); // 变一个 MonkeyKingPrototype cloneMonkeyKing = prototypeMonkey

深入浅出设计模式——原型模式(Prototype Pattern)

模式动机在面向对象系统中,使用原型模式来复制一个对象自身,从而克隆出多个与原型对象一模一样的对象.在软件系统中,有些对象的创建过程较为复杂,而且有时候需要频繁创建,原型模式通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象,这就是原型模式的意图所在. 模式定义原型模式(Prototype Pattern):原型模式是一种对象创建型模式,用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象.原型模式允许一个对象再创建另外一个可定制的对象,无