美文网首页
原型模式

原型模式

作者: 落雨松 | 来源:发表于2019-01-29 15:48 被阅读0次

原型模式就是将对象复制一份,分为浅克隆和深克隆

一、要点

1、必须实现Cloneable接口才能实现克隆
2、浅克隆只克隆对象对象引用,不克隆成员变量对象的引用。
3、深克隆不仅仅会克隆引用,而且会克隆成员变量对象的引用,克隆成一个新的引用。


image.png

4、Spring框架的beans 就是单例模式或者原型模式实现的。
5、实现cloneable的接口一般是实现浅克隆

二、实例

public class Test implements Cloneable{
    //某对象
    private T t;
   //get和set方法
    public T getT() {
        return t;
    }
    public void setT(T t) {
        this.t = t;
    }

    //浅克隆
    @Override
    protected Object clone() throws CloneNotSupportedException {
        //直接调用Object对象的clone方法
        Object obj = super.clone();
        return obj;
    }

    //深克隆
    protected Object clone1() throws CloneNotSupportedException {
        //直接调用Object对象的clone方法
        Test obj = (Test) super.clone();
        //clone 成员变量对象引用
        obj.t= (T)t.clone();
        return obj;
    }

    public static void main(String[] args) throws CloneNotSupportedException {
        Test test = new Test();
        test.setT(new T());

        //浅克隆
        Test test1 = (Test) test.clone();
        System.out.println("浅--克隆下对象引用被复制:"+test.hashCode() +"  "+ test1.hashCode());
        System.out.println("浅--克隆下成员对象引用不被复制:"+test1.getT().hashCode()+"  "+test.getT().hashCode());

        //深克隆
        Test test2 = (Test)test.clone1();
        System.out.println("深++克隆下对象引用被复制:"+test.hashCode() +"  "+ test2.hashCode());
        System.out.println("深++克隆下成员对象引用被复制:"+test2.getT().hashCode()+"  "+test.getT().hashCode());

    }
}

三、其他(网上整理)
原型模式的优缺点:

优点:(1):当创建对象的实例较为复杂的时候,使用原型模式可以简化对象的创建过程,通过复制一个已有的实例可以提高实例的创建效率。

(2):扩展性好,由于原型模式提供了抽象原型类,在客户端针对抽象原型类进行编程,而将具体原型类写到配置文件中,增减或减少产品对原有系统都没有影响。

(3):原型模式提供了简化的创建结构,工厂方法模式常常需要有一个与产品类等级结构相同的工厂等级结构,而原型模式不需要这样,圆形模式中产品的复制是通过封装在类中的克隆方法实现的,无需专门的工厂类来创建产品。

(4):可以使用深克隆方式保存对象的状态,使用原型模式将对象复制一份并将其状态保存起来,以便在需要的时候使用(例如恢复到历史某一状态),可辅助实现撤销操作。

缺点:(1):需要为每一个类配置一个克隆方法,而且该克隆方法位于类的内部,当对已有类进行改造的时候,需要修改代码,违反了开闭原则。

(2):在实现深克隆时需要编写较为复杂的代码,而且当对象之间存在多重签到引用时,为了实现深克隆,每一层对象对应的类都必须支持深克隆,实现起来会比较麻烦。

原型模式的适用环境:

1:创建新对象成本较大(例如初始化时间长,占用CPU多或占太多网络资源),新对象可以通过复制已有对象来获得,如果相似对象,则可以对其成员变量稍作修改。

2:系统要保存对象的状态,而对象的状态很小。

3:需要避免使用分层次的工厂类来创建分层次的对象,并且类的实例对象只有一个或很少的组合状态,通过复制原型对象得到新实例可以比使用构造函数创建一个新实例更加方便。

相关文章

  • 第3章 创建型模式-原型模式

    一、原型模式简介 二、原型模式的优点 ■ 三、原型模式的使用场景 ■ 四、原型模式的实例

  • 设计模式之原型模式(Prototype 模式)

    引入原型模式 原型模式的实例 为什么需要使用原型模式 引入原型模式 如果读者很熟悉javascript的话,对原型...

  • 初始设计模式之原型模式

    原型模式是什么? 原型模式怎么用?浅拷贝深拷贝 原型模式再理解 一、原型模式是什么? ​ 原型模式是一种创建型设计...

  • 设计模式之原型模式(创建型)

    [TOC] 模式定义 原型模式(Prototype Pattern):原型模式是提供一个原型接口,提供原型的克隆,...

  • 原型模式C++

    原型模式,用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 原型模式结构图 原型模式基本代码 原型...

  • 设计模式:原型

    原型模式基本介绍原型模式的实现源码中的原型模式记录 原型模式基本介绍 定义:用原型实例指定创建对象的种类,并通过复...

  • js集成

    原始继承模式--原型链 2:借用构造函数 3:共享构造原型 4:圣杯模式原型链; 构造函数; 共享原型; 圣杯模式...

  • 关于JavaScript创建对象的多种方式

    JavaScript创建对象的方法 工厂模式 构造函数模式 原型模式 组合使用构造函数模式和原型模式 动态原型模式...

  • 前端面试题总结【37】:javascript对象的几种创建方式

    工厂模式 构造函数模式 原型模式 混合构造函数和原型模式 动态原型模式 寄生构造函数模式 稳妥构造函数模式 推荐:...

  • 设计模式之原型模式

    原型模式 原型模式(prototype)是指原型实例指向对象的种类,并且通过拷贝这些原型创建新的对象 模式作用: ...

网友评论

      本文标题:原型模式

      本文链接:https://www.haomeiwen.com/subject/tkyxjqtx.html