一.什么是工厂模式:

工厂模式就是用来创建对象的一种最常用的设计模式,我们不暴露创建对象的具体逻辑,而是将逻辑封装到一个函数中,那么,这个函数 就可以被视为一个工厂。那么,在实际项目中,我们是不是可以这样子理解呢?

比如我之前做的记事本的项目中,有多个页面有播放录音的功能,为了将该功能的代码实现复用,我对该方法进行了封装,然后页面中,在使用的时候,我点击播放的时候,只是去调用我封装的方法,但是我不需要去考虑 播放的方法里面都有什么。没有暴露函数里面的具体逻辑。其实,工厂模式的根本就是面向对象的三大特性中的封装。

工厂模式根据抽象程度的不同分为简单工厂模式,工厂模式和抽象工厂模式。今天呢,主要和大家分享一下简单工厂和工厂模式这两种。

二.什么是简单工厂模式:

简单工厂模式又叫静态工厂模式,由一个工厂对象决定创建某一种产品对象类的实例,主要用来创建同一类对象。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式可以理解成,一个工厂只生产各种球的工厂,比如篮球,足球这些,客户购买的时候,只表明自己想要类型的球就可以,不必考虑球是怎么生产的。

下面的例子是封装了一个绘制的方法,该方法就相当于是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 简单工厂模式,工厂模式(二)的更多相关文章

  1. js 简单的滑动3

    js 简单的滑动教程(三)   作者:Lellansin 转载请标明出处,谢谢 在前面的基础上(js 简单的滑动教程(二)),我们可以再添加一些功能使程序的可用性更高. 比如自动为图片的LI赋id值, ...

  2. js 简单的滑动2

    js 简单的滑动教程(二)   作者:Lellansin 转载请标明出处,谢谢 现在我们让滑动多一个功能,三张图.点击左边向左滑动,点右向右滑,碰到临界值的时候可以循环滑动 原理也很将简单,用posi ...

  3. Java设计模式之工厂模式(简单工厂模式+工厂方法模式)

    摘自http://blog.csdn.net/jason0539/article/details/23020989 在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是 ...

  4. 面向对象JS基础讲解,工厂模式、构造函数模式、原型模式、混合模式、动态原型模式

    什么是面向对象?面向对象是一种思想!(废话). 面向对象可以把程序中的关键模块都视为对象,而模块拥有属性及方法.这样我们如果把一些属性及方法封装起来,日后使用将非常方便,也可以避免繁琐重复的工作.接下 ...

  5. js面向对象小结(工厂模式,构造函数,原型方法,继承)

    最近过了一遍尼古拉斯泽卡斯的高级程序设计第三版(红皮书)第六章:面向对象程序设计,现在把总结出来的东西和大家分享一下. 主要内容如下: 1.工厂模式 2.构造函数模式 3.原型模式 4.继承 一.工厂 ...

  6. C#设计模式之5:简单工厂和工厂方法模式

    工厂模式包含三种,简单工厂模式,工厂方法模式,抽象工厂模式.这三种都是解决了一个问题,那就是对象的创建问题.他们的职责就是将对象的创建和对象的使用分离开来. 当我们创建对象的时候,总是会new一个对象 ...

  7. 简单工厂模式&策略模式-简介与区别

    不得不说,这两种模式真的很像. 相似点:都用到了面向对象的继承.多态.抽象,都拥有相似的结构. 不同点:工厂模式仅提供具体的实例对象,怎么使用这个对象是client的自由,策略模式client可以通过 ...

  8. JS面向对象基础讲解(工厂模式、构造函数模式、原型模式、混合模式、动态原型模式)

    什么是面向对象?面向对象是一种思想. 面向对象可以把程序中的关键模块都视为对象, 而模块拥有属性及方法. 这样如果我们把一些属性及方法封装起来,日后使用将非常方便,也可以避免繁琐重复的工作.   工厂 ...

  9. windows服务 MVC之@Html.Raw()用法 文件流的读写 简单工厂和工厂模式对比

    windows服务   public partial class Service1 : ServiceBase{ System.Threading.Timer recordTimer;public S ...

随机推荐

  1. Eclipse 配置Tomcat 服务器

    第一部分:eclipse环境下如何配置tomcat 1.下载并成功安装Eclipse和Tomcat 2.打开Eclipse,单击“window”菜单,选择下方的“Preferences” . 选择好自 ...

  2. Java定时清理过期文件

    项目中经常需要自动定时去清理一些过期文件,这个其实Java实现挺简单的,核心部分就2个,一个定时任务,一个递归删除文件,不过前提是你的文件放在以“2018-12-05”这样命名的文件夹下,下面直接上核 ...

  3. 从头开始学Maven【依赖范围】

    例如 <dependencies> <dependency> <groupId></groupId> <artifactId></ar ...

  4. npm install 操作

    npm init node test.js$ npm install -g cnpm --registry=https://registry.npm.taobao.org (cnpm)npm inst ...

  5. spring 启动找不到shiro中 自定义的realm对应的class问题

    干巴巴盯着项目半天,启动了好多次,每次都是sping报错找不到shiro配置文件中自定义的realm对应的class文件,明明有的,就是找不到. 后来将eclipse对应的jdk1.7 更新为1.8 ...

  6. JSX的替代方案(译文)

    原文链接:https://blog.bloomca.me/2019/02/23/alternatives-to-jsx.html JSX作为一种流行的模板语言,在各种框架都得到了广泛的应用.但是,如果 ...

  7. IntelliJ IDEA配置Maven

  8. Spring Bean装配

    1. Bean注入三种方式: A. 包扫描 + 组件标注注解(@Controller/@Service/@Repository/@Component),适用场景:自己写的类: B. @Bean或xml ...

  9. python3 字典(dictionary)(二)

    内置函数: len(dict):计算字典元素个数,即键的总数 str(dict):输出字典,以可打印的字符串表示. type(variable):返回输入的变量类型,如果变量是字典就返回字典类型.   ...

  10. MYSQL水平拆分与垂直拆分

    目前很多互联网系统都存在单表数据量过大的问题,这就降低了查询速度,影响了客户体验.为了提高查询速度,我们可以优化sql语句,优化表结构和索引,不过对那些百万级千万级的数据库表,即便是优化过后,查询速度 ...