JS 简单工厂模式,工厂模式(二)
一.什么是工厂模式:
工厂模式就是用来创建对象的一种最常用的设计模式,我们不暴露创建对象的具体逻辑,而是将逻辑封装到一个函数中,那么,这个函数 就可以被视为一个工厂。那么,在实际项目中,我们是不是可以这样子理解呢?
比如我之前做的记事本的项目中,有多个页面有播放录音的功能,为了将该功能的代码实现复用,我对该方法进行了封装,然后页面中,在使用的时候,我点击播放的时候,只是去调用我封装的方法,但是我不需要去考虑 播放的方法里面都有什么。没有暴露函数里面的具体逻辑。其实,工厂模式的根本就是面向对象的三大特性中的封装。
工厂模式根据抽象程度的不同分为简单工厂模式,工厂模式和抽象工厂模式。今天呢,主要和大家分享一下简单工厂和工厂模式这两种。
二.什么是简单工厂模式:
简单工厂模式又叫静态工厂模式,由一个工厂对象决定创建某一种产品对象类的实例,主要用来创建同一类对象。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式可以理解成,一个工厂只生产各种球的工厂,比如篮球,足球这些,客户购买的时候,只表明自己想要类型的球就可以,不必考虑球是怎么生产的。
下面的例子是封装了一个绘制的方法,该方法就相当于是draw的工厂,里面有画线,画矩形的方法,通过传不同的参数控制是选择 画线,还是画矩形的方法。
class TEXT {
// 画形状
Draw(val) {
var draw;
switch(val) {
case 'line':
draw =new drawLine();
break;
case 'rectangle':
draw = new drawRect();
break;
}
return draw;
}
}
class drawLine {
draw() {
console.log('画线')
}
}
class drawRect {
draw() {
console.log('画矩形')
}
}
let text = new TEXT();
console.log('text', text.Draw('line').draw())
总结:
简单工厂的优点,在于只需要一个正确的参数,就可以获取所需要的对象,而无需知道其创建的具体细节。但是在函数内,包含了所有对象的创建逻辑,和判断逻辑的代码,每增加新的构造函数还需要修改判断逻辑代码,当我们对象过多的情况下,就难以维护了。所以简单工厂只能作用于创建的对象数量较少,对象的创建逻辑不复杂使用。
三。工厂方法模式:
工厂方法模式的本意是将实际创建对象的工作推迟到子类中,这样核心就变成了抽象类。但是在js中很难像传统面向对象那样去实现创建抽象类。所以在js中我们需要参考他的核心思想。我们将工厂方法看作是一个实例化对象的工厂类,他只做实例化对象这一件事情。
其实,可以简单理解为一个体育用品的工厂,可以生产球类、护具类等,然后球类里面还包含篮球,足球这些。工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象。这样做的目的是将产品类的实例化操作延时到工厂子类中完成,即通过工厂子类来确定究竟应该是实例化哪一个具体产品类。
class TEXT {
constructor() {
if(new.target === TEXT){
throw new Error('抽象类不能实例化!');
}
}
}
class DrawAll extends TEXT {
Draw(val) {
var draw;
switch(val) {
case 'line':
draw =new drawLine();
break;
case 'rectangle':
draw = new drawRect();
break;
}
return draw;
}
}
class drawLine {
draw() {
console.log('画线')
}
}
class drawRect {
draw() {
console.log('画矩形')
}
}
const drawAll = new DrawAll();
console.log('111', drawAll.Draw('line').draw())
JS 简单工厂模式,工厂模式(二)的更多相关文章
- js 简单的滑动3
js 简单的滑动教程(三) 作者:Lellansin 转载请标明出处,谢谢 在前面的基础上(js 简单的滑动教程(二)),我们可以再添加一些功能使程序的可用性更高. 比如自动为图片的LI赋id值, ...
- js 简单的滑动2
js 简单的滑动教程(二) 作者:Lellansin 转载请标明出处,谢谢 现在我们让滑动多一个功能,三张图.点击左边向左滑动,点右向右滑,碰到临界值的时候可以循环滑动 原理也很将简单,用posi ...
- Java设计模式之工厂模式(简单工厂模式+工厂方法模式)
摘自http://blog.csdn.net/jason0539/article/details/23020989 在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是 ...
- 面向对象JS基础讲解,工厂模式、构造函数模式、原型模式、混合模式、动态原型模式
什么是面向对象?面向对象是一种思想!(废话). 面向对象可以把程序中的关键模块都视为对象,而模块拥有属性及方法.这样我们如果把一些属性及方法封装起来,日后使用将非常方便,也可以避免繁琐重复的工作.接下 ...
- js面向对象小结(工厂模式,构造函数,原型方法,继承)
最近过了一遍尼古拉斯泽卡斯的高级程序设计第三版(红皮书)第六章:面向对象程序设计,现在把总结出来的东西和大家分享一下. 主要内容如下: 1.工厂模式 2.构造函数模式 3.原型模式 4.继承 一.工厂 ...
- C#设计模式之5:简单工厂和工厂方法模式
工厂模式包含三种,简单工厂模式,工厂方法模式,抽象工厂模式.这三种都是解决了一个问题,那就是对象的创建问题.他们的职责就是将对象的创建和对象的使用分离开来. 当我们创建对象的时候,总是会new一个对象 ...
- 简单工厂模式&策略模式-简介与区别
不得不说,这两种模式真的很像. 相似点:都用到了面向对象的继承.多态.抽象,都拥有相似的结构. 不同点:工厂模式仅提供具体的实例对象,怎么使用这个对象是client的自由,策略模式client可以通过 ...
- JS面向对象基础讲解(工厂模式、构造函数模式、原型模式、混合模式、动态原型模式)
什么是面向对象?面向对象是一种思想. 面向对象可以把程序中的关键模块都视为对象, 而模块拥有属性及方法. 这样如果我们把一些属性及方法封装起来,日后使用将非常方便,也可以避免繁琐重复的工作. 工厂 ...
- windows服务 MVC之@Html.Raw()用法 文件流的读写 简单工厂和工厂模式对比
windows服务 public partial class Service1 : ServiceBase{ System.Threading.Timer recordTimer;public S ...
随机推荐
- LightOJ 1348 (树链剖分 + 线段树(树状数组))
题目 Link 分析 典型的树链剖分题, 树链剖分学习资料 Code #include <bits/stdc++.h> using namespace std; const int max ...
- CodeForces 671C - Ultimate Weirdness of an Array
题意: 给以一个定义, F(l, r) 的值表示序列 A[1:n]的子序列 A[1....(l-1),(r+1)...n] 之中 任意两个数的最大公约数的最大值. 求 Sum=∑i=1N∑j=1N(F ...
- HBuilderx中编译sass文件
安装scss/sass编译插件 工具 -> 插件安装 -> scss/sass编译插件 将sass编译成css 新建scss文件,编写完成后,(右键scss文件 -> 外部命令/插件 ...
- vscode添加prettier格式化自动加分号问题
在vscode的settings.json中添加: "prettier.singleQuote": true, "prettier.semi": false, ...
- LR使用web_add_cookie函数进行cookie模拟
1 为什么要使用cookie模拟 从日常项目测试过程中的问题说起.比如要进行论坛中的文件下载功能的测试.我们都知道只有登录用户才能进行下载操作,这样我们的测试过程可能就变成了先登录系统,然后再进 ...
- 【原创精品】mac 彻底卸载趋势科技
在公司,给我的mac 笔电装了公司的查杀毒软件,此后,这货就像挥之不去的病毒,就像你心理上阴影一样如影随形,最邻人方案的是这货没界面,只是个后台服务,一般人就没办法了.最最令人反感的是它经常控制/拖慢 ...
- Django—Form、ModelForm
一.Form form.py from django import forms from django.core.exceptions import ValidationError from djan ...
- linux 大杂烩
1.linux mysql输错命令 mysql命令行中执行多行命令时,如果前边输入的命令发生错误,是很令人头疼的事情,可以通过输入\c来取消前边的输入,重新进入“mysql->”提示符. 2.l ...
- 独立版Jexus配置SSL,支持https访问
一.申请证书[腾讯免费证书] 二.验证DNS,即解析域名.记录类型选择 TXT ,主机记录与证书上的主机记录保持一致,记录值也与证书上的记录值保持一致 三.等待DNS验证与CA轮询,轮询成功后即可下载 ...
- SpringBoot的事件监听
事件监听的流程分为三步:1.自定义事件,一般是继承ApplicationEvent抽象类.2.定义事件监听器,一般是实现ApplicationListener接口.3.a.启动的时候,需要将监听器加入 ...