什么是工厂模式?

简单来说:工厂模式是一种 创建模式,用来解决创建对象的问题。根据参数类型,通过调用工厂方法来创建不同类型的对象。

为什么使用工厂模式?

当我们需要根据不同的需要来创建不同对象的时候,那么工厂模式就可以派上用场了。举个栗子:我们用代码来演示

function phoneShop() {}
phoneShop.prototype = {sellPhone: function(type) {var phone;switch(type) {case '苹果':phone = new iPhone()breakcase '华为': phone = new Huawei()breakdefault:phone = new Xiaomi()}phone.film()  //给手机贴膜return phone}}function iPhone() {this.say = function() {console.log('iPhone: 宇宙我最贵')}this.film = function() {console.log('iPhone 贴膜完成')}
}function Huawei() {this.say = function() {console.log('华为: 我能看到银河')}this.film = function() {console.log('华为贴膜完成')}
}function Xiaomi() {this.say = function() {console.log('小米: 你永远买不到我')}this.film = function() {console.log('小米贴膜完成')}
}var shop = new phoneShop()
var myPhone = shop.sellPhone('华为')
myPhone.say()复制代码

那么对于手机店,不应该负责手机的生产,即new iphone() 这个实例的生产过程,交给手机工厂去生产就好,手机商店只负责销售和贴膜。那么应用工厂模式,代码如下:

var phoneFactory = {createPhone: function(type) {var phone;switch(type) {case '苹果':phone = new iPhone()breakcase '华为': phone = new Huawei()breakdefault:phone = new Xiaomi()}return phone}}function phoneShop() {}
phoneShop.prototype = {sellPhone: function(type) {var phone = phoneFactory.createPhone(type)phone.film()return phone}}function iPhone() {this.say = function() {console.log('iPhone: 宇宙我最贵')}this.film = function() {console.log('iPhone 贴膜完成')}
}function Huawei() {this.say = function() {console.log('华为: 我能看到银河')}this.film = function() {console.log('华为贴膜完成')}
}function Xiaomi() {this.say = function() {console.log('小米: 你永远买不到我')}this.film = function() {console.log('小米贴膜完成')}
}var shop = new phoneShop();
var myPhone = shop.sellPhone('苹果')
myPhone.say()
复制代码

这样,我们通过phoneFactory.createPhone 来实例化手机对象,这样我们只需要关注商店需要什么类型的手机,工厂就可以产出相应的手机。

具体应用场景

1.比如我们最常见的jquery中的$('div')在选择div的时候就应用到了工厂模式,具体代码如下:

window.$ = function(selector){return new JQuery(selector)
}class JQuery{constructor(selector){//省略}
}复制代码

这样我们便使用到了工厂模式。

2.我们根据不同的操作来创建不同的DOM

const Dom = {create:  function(type, url) {return new this.types[type](url) },types: {text: function(url) {this.appendTo = function(parent) {parent.appendChild(document.createTextNode(url))}},image: function(url) {this.appendTo = function(parent) {let img = document.createElement('img')img.src = urlparent.appendChild(img)}},link: function(url) {this.appendTo = function(parent) {let link = document.createElement('a')link.href = urllink.appendChild(document.createTextNode(url))parent.appendChild(link)}}}
}Dom.create('text', 'https://baidu.com').appendTo(document.body)
Dom.create('link', 'https://baidu.com').appendTo(document.body)
Dom.create('image', 'https://img.com').appendTo(document.body)复制代码

总结

当我们需要根据不同的条件来创建对象的时候,我们就可以考虑,使用工厂模式创建。

外部不许关心内部构造器是怎么生成的,只需调用一个工厂方法生成一个实例即可;

使构造函数和创建者分离,使程序的耦合度降低。

转载于:https://juejin.im/post/5d07013f518825699040e9a8

javascript设计模式之工厂模式相关推荐

  1. JavaScript设计模式--简单工厂模式例子---XHR工厂

    JavaScript设计模式--简单工厂模式例子---XHR工厂 第一步,Ajax操作接口(目的是起一个接口检测作用) (1)引入接口文件 //定义一个静态方法来实现接口与实现类的直接检验 //静态方 ...

  2. JavaScript设计模式-10.工厂模式实例xhr

    1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 < ...

  3. JavaScript设计模式———抽象工厂模式

    定义: 抽象工厂其实是实现子类继承父类的方法,只是一个方法.抽象工厂模式一般用在多人协作的超大型项目中,并且严格的要求项目以面向对象的思想进行完成. 简单工厂模式和工厂模式都是直接生产实例的,抽象工厂 ...

  4. javascript设计模式-抽象工厂模式

    1 <!doctype html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...

  5. JavaScript设计模式 - 抽象工厂模式

    抽象工厂模式 这也是针对工厂模式无法应对多对象多复杂对象而出的一种模式,抽象工厂模式并不是直接生成实例,而是对于产品的一个分类的创建 class User {constructor(name, rol ...

  6. javascript设计模式--抽象工厂模式

    抽象工厂模式(abstract Fctory):通过对类的工厂抽象使其业务用于对产品类鏃的创建,而不负责创建某一类产品的实例. //汽车抽象类,当使用其实例对象的方法时会抛出错误var Car = f ...

  7. JavaScript设计模式-享元模式

    JavaScript设计模式-享元模式 概念 例子 内部状态与外部状态 享元模式的通用结构 例子 总结 github仓库地址:点击 [设计模式例子](https://github.com/fanhua ...

  8. Java设计模式(工厂模式>抽象工厂模式和原型模式)

    Java设计模式Ⅱ 1.工厂模式 1.1 简单工厂模式 1.2 工厂方法模式 2.抽象工厂模式 3.总结 4.原型模式 4.1 原型模式 4.2 浅拷贝 4.3 深拷贝 5.建造者模式 1.工厂模式 ...

  9. 三角形圆形创建与擦除java_设计模式---------------简单工厂模式

    设计模式---------------简单工厂模式 一.题目(Question) 使用简单工厂模式设计一个可以创建不同几何形状(如圆形.方形和三角形等)的绘图工具,每个几何图形都要有绘制draw()和 ...

最新文章

  1. 1.2、什么是函数?什么是方法
  2. 模拟post请求--测试api是否可用--再交给ios开发
  3. 透露|Java学习的最后一点小秘密
  4. 我也来记录我的一些开发心得和笔记!
  5. 如何在.NET Core中为gRPC服务设计消息文件(Proto)
  6. 【Python】Matplotlib绘制七彩锥面
  7. 7. COM编程——初始化并创建COM对象
  8. 如何在HTML中使用JavaScript代码
  9. 论坛之家-免费论坛申请-3分钟建立自己的个性化论坛
  10. 51单片机中断检测回复http://www.51hei.com/bbs/dpj-162071-1.html单片机点亮小灯的问题,几行代码,实在想不通怎么执行的
  11. ubuntu16.04安装谷歌拼音输入法并可在QtCreator中使用
  12. 破解安装谷歌翻译软件 Translate Client ( 含文件下载链接 )
  13. 百度文库等禁止页面弹出(禁用javascript)
  14. ps如何把自己的图与样机结合_如何利用PS制作贴图样机那
  15. VC中字符串形式ip地址和整数形式ip地址转换
  16. C++ 实现两线段是否相交、相交情况、若相交求出交点坐标
  17. VirtualBox虚拟机网络设置(四种方式)
  18. 别再乱用了,这才是 @Validated 和 @Valid 的真正区别!!!
  19. Flink / Scala 实战- 4.BroadCast 广播流数据先到再处理 Source 数据
  20. Arcpy平面坐标转经纬度坐标

热门文章

  1. 进程栈大小 与 线程栈大小-转
  2. CCCC-GPLT L1-039. 古风排版 团体程序设计天梯赛
  3. Executors.newFixedThreadPool(NTHREADS)线程池数量设置多少合适?
  4. Spark Streaming 原理剖析
  5. 关于 Injection of autowired dependencies failed 错误的解决方法
  6. CEF使用的几个注意点
  7. 使用 Redis 实现自动补全功能
  8. Part 4 —— Go 模块:v2 及更高版本
  9. Golang map 三板斧第一式:快速上手
  10. Windows 7 下 QT5 开发环境搭建