zoukankan      html  css  js  c++  java
  • *工厂方法模式(factory)

      简单工厂模式每次添加新需求,不仅要添加类,还要修改工厂函数。每次都要修改两个地方,这样太麻烦了,工厂方法模式则可以解决这个问题。

      工厂方法模式本意是说将实际创建对象工作推迟到子类中。这样核心类就变成了抽象类,但避免有人忽略new关键字,我们采用安全模式类。而我们将创建对象的基类放在工厂方法类的原型中。

      

     1 // 工厂方法模式
     2 // 安全模式创建工厂类,避免有人没写new关键字的情况
     3 var Factory = function(type, content) {
     4     if(this instanceof Factory) {
     5         var s = new this[type](content);
     6     }else {
     7         return new Factory(type, content);
     8     }
     9 }
    10 // 工厂原型中设置创建所有类型数据对象的基类
    11 Factory.prototype = {
    12     Java: function(content) {
    13         this.content = content
    14         console.log(this.content);
    15     },
    16     JavaScript: function(content) {
    17         console.log(content);
    18     },
    19     UI: function(content) {
    20         console.log(content)
    21     },
    22     PHP: function(content) {
    23         console.log(content);
    24     }
    25 }
    26 // 测试用例
    27 var data = [
    28     {type:'JavaScript', content:'JavaScript'},
    29     {type:'Java', content:'Java'},
    30     {type:'UI', content:'UI'},
    31     {type:'PHP', content:'PHP'},
    32 ]
    33 for(var i=0; i<data.length; i++) {
    34     Factory(data[i].type, data[i].content);
    35 }

      这样如果想添加其他类,只需要在Factory这个工厂类的原型里面添加就可以了。

     

    拓展:

      安全模式类式说可以屏蔽使用这对类的错误使用造成的错误。

      解决方案是在构造函数开始时先判断当前的this对象是不是类,如果是则通过new关键字创建对象;如果不是说明类在全局作用域中执行(通常情况下),那么既然在全局作用域中执行,当然this就会指向window(通常情况下,如非浏览器环境可为其他全局变量),这样就要重新返回新创建的对象了。

    参考资料:《JavaScript设计模式》

  • 相关阅读:
    BZOJ 3158: 千钧一发
    BZOJ 1677: [Usaco2005 Jan]Sumsets 求和
    BZOJ 1574: [Usaco2009 Jan]地震损坏Damage
    BZOJ 1644: [Usaco2007 Oct]Obstacle Course 障碍训练课
    BZOJ 1715: [Usaco2006 Dec]Wormholes 虫洞
    BZOJ 1634: [Usaco2007 Jan]Protecting the Flowers 护花
    Vijos P1740聪明的质检员
    Vijos P1680距离
    Vijos P1067Warcraft III 守望者的烦恼
    BZOJ 1385: [Baltic2000]Division expression
  • 原文地址:https://www.cnblogs.com/daheiylx/p/13827423.html
Copyright © 2011-2022 走看看