资讯专栏INFORMATION COLUMN

JS 设计模式 六(工厂模式)

raoyi / 2627人阅读

摘要:首先吧之前的代码打包成一个新的设计模式公用代码工厂模式要点工厂接口是工厂方法模式的核心,与调用者直接交互用来提供产品。适用场景在任何需要生成复杂对象的地方,都可以使用工厂方法模式。

工厂模式

之前讲了接口,封装,继承,单例等,现在就需要应用这些特性来完成一些设计模式了。首先吧之前的代码打包成一个新的JS

DesignPattern.js
// 设计模式公用代码     
exports.Interface = function (object, methods) {
  for (var i = 0, len = methods.length; i < len; i++) {
    if (typeof methods[i] !== "string") {
      throw new Error("Interface constructor expects method names to be passed in as a string.");
    }
    object[methods[i]] = function () {
      throw new Error(this.constructor.name + " Interface function is undefined");
    };
  }
};

exports.Extend = function (subClass, superClass) {
  var F = function () {
  };
  F.prototype = superClass.prototype;
  subClass.prototype = new F();
  subClass.prototype.constructor = subClass;

  subClass.superclass = superClass.prototype;
  if (superClass.prototype.constructor == Object.prototype.constructor) {
    superClass.prototype.constructor = superClass;
  }
}

exports.Clone = function (object) {
  function F() {
  }

  F.prototype = object;
  return new F;
}

exports.Augment = function (receivingClass, givingClass) {
  if (arguments[2]) { // Only give certain methods.
    for (var i = 2, len = arguments.length; i < len; i++) {
      receivingClass.prototype[arguments[i]] = givingClass.prototype[arguments[i]];
    }
  }
  else { // Give all methods.
    for (methodName in givingClass.prototype) {
      if (!receivingClass.prototype[methodName]) {
        receivingClass.prototype[methodName] = givingClass.prototype[methodName];
      }
    }
  }
}
工厂模式要点

1.工厂接口是工厂方法模式的核心,与调用者直接交互用来提供产品。

2.工厂实现决定如何实例化产品,是实现扩展的途径,需要有多少种产品,就需要有多少个具体的工厂实现。

适用场景:

1.在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,无需使用工厂模式。

2.工厂模式是一种典型的解耦模式,迪米特法则在工厂模式中表现的尤为明显。假如调用者自己组装产品需要增加依赖关系时,可以考虑使用工厂模式。将会大大降低对象之间的耦合度。

3.当需要系统有比较好的扩展性时,可以考虑工厂模式,不同的产品用不同的实现工厂来组装。

代码
var DP = require("./DesignPattern.js");

function CarFactory() {//定义工厂
  this.run = function () {
    console.log(this.productCar()+"启动");
  }
  DP.Interface(this, ["productCar"]);
}

function PorscheFactory() {//实例化保时捷工厂
  this.__proto__ = new CarFactory();
  this.productCar = function () {
    return "保时捷";
  }
}

function TractorFactory() {//实例化拖拉机工厂并不重写接口测试接口定义
  this.__proto__ = new CarFactory();
}

var Porsche = new PorscheFactory();
Porsche.run();


var Tractor = new TractorFactory();
Tractor.run();
总结

由于javascript没有原生接口,所以需要自己想方法来实现接口这个原则。使用了接口以后就可以方便实现工厂模式。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/79456.html

相关文章

  • Junit源码阅读()之Junit中的设计模式

    摘要:前言在这次的博客中我们将着重于的许多集成性功能来讨论中的种种设计模式。装饰器模式装饰器模式是为了在原有功能上加入新功能,在中绝对属于使用最频繁架构中最核心的模式,等都是通过装饰器模式来完成扩展的。 前言 在这次的博客中我们将着重于Junit的许多集成性功能来讨论Junit中的种种设计模式。可以说Junit的实现本身就是GOF设计原则的范例教本,下面就让我们开始吧。 装饰器模式 装饰器...

    jlanglang 评论0 收藏0
  • JS或Jquery

    摘要:大潮来袭前端开发能做些什么去年谷歌和火狐针对提出了的标准,顾名思义,即的体验方式,我们可以戴着头显享受沉浸式的网页,新的标准让我们可以使用语言来开发。 VR 大潮来袭 --- 前端开发能做些什么 去年谷歌和火狐针对 WebVR 提出了 WebVR API 的标准,顾名思义,WebVR 即 web + VR 的体验方式,我们可以戴着头显享受沉浸式的网页,新的 API 标准让我们可以使用 ...

    CatalpaFlat 评论0 收藏0
  • 复习笔记(新手向) - JS对象声明的几种方式

    摘要:二用操作符构造对象属性名属性值属性名属性值属性名属性值属性名属性值方法名方法名首先用创建一个空对象,然后用多条语句给对象添加属性方法。他的写法与三用函数声明的方式构造对象比较像,但是稍有不同。 -- 新手向知识,就不用ES6写法了。 一、字面量声明 var obj = { 属性名1 : 属性值, 属性名2 : 属性值, 属性名3 : 属性...

    davidac 评论0 收藏0
  • 详解Spring中的9种设计模式「记得收藏」

    摘要:简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类。中的就是简单工厂模式的体现,根据传入一个唯一的标识来获得对象,但是否是在传入参数后创建还是传入参数前创建这个要根据具体情况来定。中的就是典型的工厂方法模式。 showImg(https://segmentfault.com/img/bVbwbd9?w=640&h=492); 一. 简单工厂又叫做静态工厂方法(...

    Dean 评论0 收藏0
  • 前端面试题小集

    摘要:一一个页面上两个左右铺满整个浏览器,要保证左边的一直为,右边的跟随浏览器大小变化比如浏览器为,右边为,浏览器为,右边为,请写出大概的代码。如果需要使用,最好是通过动态给添加属性值,这样可以绕开以上两个问题。 一、一个页面上两个div左右铺满整个浏览器,要保证左边的div一直为100px,右边的div跟随浏览器大小变化(比如浏览器为500,右边div为400,浏览器为900,右边div为...

    bawn 评论0 收藏0

发表评论

0条评论

raoyi

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<