javascript设计模式之工厂模式
什么是工厂模式?
简单来说:工厂模式是一种 创建模式,用来解决创建对象的问题。根据参数类型,通过调用工厂方法来创建不同类型的对象。
为什么使用工厂模式?
当我们需要根据不同的需要来创建不同对象的时候,那么工厂模式就可以派上用场了。举个栗子:我们用代码来演示
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设计模式之工厂模式相关推荐
- JavaScript设计模式--简单工厂模式例子---XHR工厂
JavaScript设计模式--简单工厂模式例子---XHR工厂 第一步,Ajax操作接口(目的是起一个接口检测作用) (1)引入接口文件 //定义一个静态方法来实现接口与实现类的直接检验 //静态方 ...
- JavaScript设计模式-10.工厂模式实例xhr
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 < ...
- JavaScript设计模式———抽象工厂模式
定义: 抽象工厂其实是实现子类继承父类的方法,只是一个方法.抽象工厂模式一般用在多人协作的超大型项目中,并且严格的要求项目以面向对象的思想进行完成. 简单工厂模式和工厂模式都是直接生产实例的,抽象工厂 ...
- javascript设计模式-抽象工厂模式
1 <!doctype html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...
- JavaScript设计模式 - 抽象工厂模式
抽象工厂模式 这也是针对工厂模式无法应对多对象多复杂对象而出的一种模式,抽象工厂模式并不是直接生成实例,而是对于产品的一个分类的创建 class User {constructor(name, rol ...
- javascript设计模式--抽象工厂模式
抽象工厂模式(abstract Fctory):通过对类的工厂抽象使其业务用于对产品类鏃的创建,而不负责创建某一类产品的实例. //汽车抽象类,当使用其实例对象的方法时会抛出错误var Car = f ...
- JavaScript设计模式-享元模式
JavaScript设计模式-享元模式 概念 例子 内部状态与外部状态 享元模式的通用结构 例子 总结 github仓库地址:点击 [设计模式例子](https://github.com/fanhua ...
- Java设计模式(工厂模式>抽象工厂模式和原型模式)
Java设计模式Ⅱ 1.工厂模式 1.1 简单工厂模式 1.2 工厂方法模式 2.抽象工厂模式 3.总结 4.原型模式 4.1 原型模式 4.2 浅拷贝 4.3 深拷贝 5.建造者模式 1.工厂模式 ...
- 三角形圆形创建与擦除java_设计模式---------------简单工厂模式
设计模式---------------简单工厂模式 一.题目(Question) 使用简单工厂模式设计一个可以创建不同几何形状(如圆形.方形和三角形等)的绘图工具,每个几何图形都要有绘制draw()和 ...
最新文章
- 1.2、什么是函数?什么是方法
- 模拟post请求--测试api是否可用--再交给ios开发
- 透露|Java学习的最后一点小秘密
- 我也来记录我的一些开发心得和笔记!
- 如何在.NET Core中为gRPC服务设计消息文件(Proto)
- 【Python】Matplotlib绘制七彩锥面
- 7. COM编程——初始化并创建COM对象
- 如何在HTML中使用JavaScript代码
- 论坛之家-免费论坛申请-3分钟建立自己的个性化论坛
- 51单片机中断检测回复http://www.51hei.com/bbs/dpj-162071-1.html单片机点亮小灯的问题,几行代码,实在想不通怎么执行的
- ubuntu16.04安装谷歌拼音输入法并可在QtCreator中使用
- 破解安装谷歌翻译软件 Translate Client ( 含文件下载链接 )
- 百度文库等禁止页面弹出(禁用javascript)
- ps如何把自己的图与样机结合_如何利用PS制作贴图样机那
- VC中字符串形式ip地址和整数形式ip地址转换
- C++ 实现两线段是否相交、相交情况、若相交求出交点坐标
- VirtualBox虚拟机网络设置(四种方式)
- 别再乱用了,这才是 @Validated 和 @Valid 的真正区别!!!
- Flink / Scala 实战- 4.BroadCast 广播流数据先到再处理 Source 数据
- Arcpy平面坐标转经纬度坐标