js的工厂模式
工厂模式:
什么叫工厂模式,工厂就是大家大脑里想的那样,一个流水线作业的一个东西,只需要满足刚需就可以了,一个人,只干一件事,最后串起来,就是一个事件。
首先需要说一下工厂模式。工厂模式根据抽象程度的不同分为三种:
- 简单工厂模式
- 工厂方法模式
- 抽象工厂模式
简单工厂:
简单工厂说白了,就是需要想到你要干什么,要分几步做,把每个事件全都摆出来,完咯,开始着手建厂,在厂里把你想干的事情,全都分列清除,把条件弄好,好知道来需求的时候,知道哪些人干活。最后就是客户提的需求了,根据需求去办事。
代码案例:
/**
* 宝马
*/
var Baoma = function () {
this.play = function () {
console.log('我在造宝马');
}
} /**
* 奥迪
*/
var Aodi = function () {
this.play = function () {
console.log('我在造奥迪');
}
} //造宝马事件
var baoma = new Baoma();
// 运行造宝马事件
baoma.play();
// 造奥迪事件
var aodi = new Aodi();
// 运行造奥迪事件
aodi.play(); /**
* 造小汽车工厂
*/
var Ball = function(name) {
switch (name) {
case '宝马':
return new Baoma();
break;
case '奥迪':
return new Aodi();
break;
}
}
// 客户需求要宝马
var baoma = Ball('宝马');
// 来开造
baoma.play();
// 客户需要奥迪
var aodi = Ball('奥迪');
//来开造
aodi.play();
工厂方法:
工厂方法说白了就是在工厂里面去写方法,在外部写一个公用的方法去调取工厂的独有方法,来实现客户的需求
代码如下:
// 安全模式创建工厂类
var Ball = function (type,name) {
// 判断实例是否属于ball
if(this instanceof Ball) {
var s = new this[type](name);
console.log(s)
return s;
}else {
return;
}
}
// 工厂原型中设置创建所有类型数据对象的基类
Ball.prototype = {
baoma: function(name) {
this.play = function() {
console.log('我在生产'+name);
}
},
aodi: function(name) {
this.play = function() {
console.log('我在建造'+name);
}
},
}
// 客户需求
var baoma = new Ball('baoma','宝马');
// 开始建造
baoma.play();
// 客户需求
var aodi = new Ball('aodi','奥迪');
// 开始建造
aodi.play();
/*
baoma {play: ƒ}
我在建造宝马
aodi {play: ƒ}
我在生产奥迪
*/
对比简单模式和方法模式,方法模式的代码,要比简单工厂模式的代码要少的多,最后只需要在工厂里面去添加方法,去调用就行了,不要再往开发零件区去填写内容了。
抽象工厂:
抽象工厂,说白了比较抽象的,说是抽象,其实看着也差不多应改,在开始的时候建一个工厂,里面去判断这个方法,有这个方法的时候就开始继承,指向,继承,最后运行事件,感觉代码老多了,不易理解,要建一个私有类,完咯在工厂中找到这个类,取到类的值,用值去跑建造方法。最后当然就是需求的提交,和程序的运行了
// # 抽象工厂模式
var Sport = function(subType, superType) {
if( typeof Sport[superType] === 'function'){
// 缓存类
function F() {};
// 继承父类属性和方法
F.prototype = new Sport[superType]();
// 将子类constructor 指向子类
subType.constructor = subType;
// 子类原型继承 “父类”
subType.prototype = new F();
}else {
// 不存在抽象类则抛出错误
throw new Error('未创建该抽象类');
}
} // 宝马抽象类
Sport.baoma = function () {
this.type = 'baoma';
}
Sport.baoma.prototype = {
play: function () {
return new Error('抽象方法不能调用');
}
} // 奥迪抽象类
Sport.aodi = function () {
this.type = 'aodi';
}
Sport.aodi.prototype = {
play: function () {
return new Error('抽象方法不能调用');
}
} // 大众抽象类
Sport.dazhong = function () {
this.type = 'dazhong';
}
Sport.dazhong.prototype = {
play: function () {
return new Error('抽象方法不能调用');
}
} // 宝马类
var BasketBall = function (name) {
this.name = name;
};
// 抽象工厂实现对宝马的继承
Sport(BasketBall,'baoma');
BasketBall.prototype.play = function () {
console.log('我在造'+this.name);
} // 奥迪类
var WeightLifting = function (name) {
this.name = name;
};
// 抽象工厂实现对奥迪的继承
Sport(WeightLifting,'aodi');
WeightLifting.prototype.play = function () {
console.log('我在造'+this.name);
} // 大众类
var Running = function (name) {
this.name = name;
};
// 抽象工厂实现对大众的继承
Sport(Running,'dazhong');
Running.prototype.play = function () {
console.log('我在造'+this.name);
} // 抽象工厂模式实现
var basketBall = new BasketBall('宝马');
console.log(basketBall.type);//baoma
basketBall.play();
var weightLifting = new WeightLifting('奥迪');
console.log(weightLifting.type);//aodi
weightLifting.play();
var running = new Running('大众');
console.log(running.type);//ball
running.play(); /** 输出结果
* baoma
* 我在造宝马
* aodi
* 我在造奥迪
* dazhong
* 我在造大众
*/
在vue项目中使用,大家熟悉的莫过于路由了,其实路由页面的代码就应该算是一个简单工厂,但没有那些复杂的方法,
import Vue from 'vue'
import Router from 'vue-router'
import MainTab from '@/views/MainTab'
import PersonRegister from '@/views/PersonRegister'
Vue.use(Router) export default new Router({
routes: [
{
// 根目录
path: '/',
component: MainTab,
redirect:'/PersonRegister',
children: [
{
// 人员登记
path: '/PersonRegister',
name: 'PersonRegister',
component: PersonRegister
},
{
// 签到表详情
path: '/InterviewSigin',
name: 'InterviewSigin',
component: () => import('@/views/InterviewSigin')
},
{
// 邀约人页面
path: '/inviteApproval',
name: 'inviteApproval',
component: () => import('@/views/inviteApproval')
},
{
// 删除统计
path: '/DeleteCount',
name: 'DeleteCount',
component: () => import('@/views/DeleteCount')
},
{
// 离场统计
path: '/DepartureCount',
name: 'DepartureCount',
component: () => import('@/views/DepartureCount')
},
{
// 签到表
path: '/SiginManage',
name: 'SiginManage',
component: () => import('@/views/SiginManage')
}
]
}
]
})
在上面的代码中就可以看出来,他的子路由就是一块一块的,就好比是工厂模式的上面的每一方法一样,我也不知道这样嵌套这说对不对,我感觉差不多吧,你想添加页面的话,只需要在里面写一个子路由就行了。
抽象工厂模式的优点:
当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象。
增加新的具体工厂和产品族很方便,无须修改已有系统,符合“开闭原则”。
抽象工厂模式的缺点:
开闭原则的倾斜性(增加新的工厂和产品族容易,增加新的产品等级结构麻烦)。
增加新的产品等级结构:对于增加新的产品等级结构,需要修改所有的工厂角色,包括抽象工厂类,在所有的工厂类中都需要增加生产新产品的方法,不能很好地支持“开闭原则”。
抽象工厂模式的适用情况:
在以下情况下可以使用抽象工厂模式:
一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有类型的工厂模式都是重要的。
系统中有多于一个的产品族,而每次只使用其中某一产品族。
属于同一个产品族的产品将在一起使用,这一约束必须在系统的设计中体现出来。系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现。
抽象工厂模式总结
抽象工厂模式是所有形式的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式与工厂方法模式最大的区别在于,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式则需要面对多个产品等级结构。
抽象工厂模式适用情况包括:一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节;系统中有多于一个的产品族,而每次只使用其中某一产品族;属于同一个产品族的产品将在一起使用;系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现。
js的工厂模式的更多相关文章
- JavaScript---正则使用,日期Date的使用,Math的使用,JS面向对象(工厂模式,元模型创建对象,Object添加方法)
JavaScript---正则使用,日期Date的使用,Math的使用,JS面向对象(工厂模式,元模型创建对象,Object添加方法) 一丶正则的用法 创建正则对象: 方式一: var reg=new ...
- js对于工厂模式的理解
有很多人对工厂模式有着这样或者那样不理解的地方,今天我就和大家分享一下我的心得. 其实工厂模式是基于面向对象的一种模式.大家先看这样的一段代码: 其实这个程序很简单,学过js的人都会写,基本没什么问题 ...
- JS 简单工厂模式,工厂模式(二)
一.什么是工厂模式: 工厂模式就是用来创建对象的一种最常用的设计模式,我们不暴露创建对象的具体逻辑,而是将逻辑封装到一个函数中,那么,这个函数 就可以被视为一个工厂.那么,在实际项目中,我们是不是可以 ...
- JS之工厂模式
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- js设计模式-工厂模式(抽象工厂)
场景:定义一个抽象类 AbsProducer(生产商),该生产商有两个行为,一个生产,一个出售,其中生产方法为抽象方法,由具体的厂家(工厂)去实现,出售的产品均是电子产品(返回的对象为电子产品对象,即 ...
- js设计模式--工厂模式
工厂模式: 工厂模式的目的是为了创建对象,它经常是在类和类的方法中实现.简单的工厂模式是由一个方法来决定到底要创建哪类的实例,这些实例经常拥有相同的接口,这种模式在所实例化的类型在编译期并不确定,而是 ...
- JS设计模式——工厂模式详解
它的领域中同其它模式的不同之处在于它并没有明确要求我们使用一个构造器.取而代之,一个工厂能提供一个创建对象的公共接口,我们可以在其中指定我们希望被创建的工厂对象的类型. 简单工厂模式:使用一个类(通常 ...
- [js]js设计模式-工厂模式
// 定义一个人 var p1 = { name: 'wxb', age: 22, writejs: function () { console.log(this.name + ' can sing. ...
- 浅谈js抽象工厂模式
一.简单工厂 定义:简单工厂模式中,可以根据参数的不同返回不同类的实例.简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类. 比如你去专门卖鼠标的地方你可以买各种各样的 ...
- JS "trycatch工厂模式"
大家都用过Ajax的异步交互,下面的代码中使用 "trycatch工厂模式" 来进行针对Ajax请求对象的变化点进行封装 <script type="text/ ...
随机推荐
- git 忽略 Pycharm 中的 workspace.xml 文件
.gitignore 中要写上 workspace.xml 如果已经不幸之前commit workspace.xml 的话,必须执行以下命令 $ git rm --cached .idea/works ...
- hyperledger fabric 1.0.5 分布式部署 (二)
环境:2台 ubuntu 16.04 角色列表 角色 IP地址 宿主端口 docker端口 peer0.org1.example.com 47.93.249.250 7051 7051 pe ...
- C#字符串判断
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...
- E - Round Numbers
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> ...
- java数据结构----数组篇
1.数组作为java常用的数据结构之一,使用相对简单,下图展示了数组常用操作在允许和不允许重复值的情况下的比较次数 2.进行封装后的代码: package com.cn.higharray; /** ...
- [模板](luogu P3387)縮點
前言:對於這週的咕咕咕表示好像沒什麼好表示的,完全沒有靈感a......寫東西真的好難啊......於是又玩了半天鬼泣4???還挺好玩的 來源:題解 题目背景 缩点+DP 题目描述 给定一个n个点m条 ...
- JS 两个数组合并
让我们先考虑下面这情况: 代码如下: var a = [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ];var b = [ "foo", "bar", ...
- p标签中的文本换行
参考文章 word-break:break-all和word-wrap:break-word的区别 CSS自动换行.强制不换行.强制断行.超出显示省略号 属性介绍 white-space: 如何处理元 ...
- 用javascript编写一个简单的随机验证码程序
简单模拟网页的随机数字验证码,效果图如下: html代码: <div id="content"> <div class="left"> ...
- HashMap的小总结 + 源码分析
一.HashMap的原理 所谓Map,就是关联数组,存的是键值对——key&value. 实现一个简单的Map,你也许会直接用两个LIst,一个存key,一个存value.然后做查询或者get ...