zoukankan      html  css  js  c++  java
  • 原型模式

    原型模式

    原型模式Prototype Pattern用原型实例指向创建对象的类,使用于创建新的对象的类的共享原型的属性与方法。

    描述

    JavaScript中可以利用其特有的原型继承特性去实现创建对象的方式,也就是创建的一个对象作为另外一个对象的prototype属性值,原型对象本身就是有效地利用了每个构造器创建的对象,其将实例之间相同的属性和方法提取成共有的属性和方法,而这些属性与方法都可以被实例共享。
    Java中通常是用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象,即通过一个抽象类实现Cloneable接口以及重写Object类中的clone方法,之后使用子类继承此抽象类并在一个缓存类中使用集合类例如HashTable进行存储,当需要类时便可以找到HashTable中该类通过clone实现得到一个新的子类,使用原型模式创建对象比直接new一个对象在性能上要好的多,因为Object类的clone方法是一个本地方法,它直接操作内存中的二进制流,特别是复制大对象时,性能的差别非常明显。使用原型模式的另一个好处是简化对象的创建,使得创建对象就像我们在编辑文档时的复制粘贴一样简单,所以在需要重复地创建相似对象时可以考虑使用原型模式,此外深拷贝与浅拷贝问题中,会发生深拷贝的有Java中的8种基本类型以及他们的封装类型以及String类型,其余的都是浅拷贝。

    优点

    • 提高性能。
    • 避免构造函数的约束。

    缺点

    • 在原型中需要对所有类的功能进行考虑。
    • 创建对象不会调用类的构造方法。

    实现

    var Shape = {
        name : null,
        say: function(){
            console.log(this.name);
        }
    }
    
    var rectangle = Object.create(Shape);
    rectangle.name = "Rectangle";
    rectangle.say(); // Rectangle
    
    var square = Object.create(Shape);
    square.name = "Square";
    square.say(); // Square
    
    var circle = Object.create(Shape);
    circle.name = "Circle";
    circle.say(); // Circle
    

    每日一题

    https://github.com/WindrunnerMax/EveryDay
    

    参考

    https://segmentfault.com/a/1190000012427846
    https://www.runoob.com/design-pattern/prototype-pattern.html
    https://wiki.jikexueyuan.com/project/java-design-pattern/prototype-pattern.html
    
  • 相关阅读:
    golang删除数组某个元素
    golang用通道实现信号量,控制并发个数
    什么是ScaleIO中的forwards rebuild和backwards rebuild?
    SQL Server中的database checkpoint
    如何将thick provision lazy zeroed的VMDK文件转换为thick provision eager zeroed?
    LoadTestAgentResultsLateException in VS2010
    SQL Server Instance无法启动了, 因为TempDB所在的分区没有了, 怎么办?
    VMware vCenter中, 如何辩认虚机上Raw Device Mapping过了的一块物理磁盘?
    SQL Server AlwaysOn Setup Step-By-Step Guide
    TPC-E在populate测试Database时需要注意的一些事项
  • 原文地址:https://www.cnblogs.com/WindrunnerMax/p/13673366.html
Copyright © 2011-2022 走看看