设计模式清单

没有链接的是还没有写的,计划要写的,欢迎阅读交流~
前端设计模式(0)面向对象&&设计原则
前端设计模式(1)--工厂模式
前端设计模式(2)--单例模式
前端设计模式(3)--适配器模式
前端设计模式(4)--装饰器模式
前端设计模式(5)--代理模式
前端设计模式(6)--外观模式&&观察者模式
前端设计模式(7)--状态和策略模式
前端设计模式(8)--原型模式
...

写在前面

设计模式有23种,按大类归类的话可以分为三大类:创建型(如:工厂模式、单例模式、原型模式等),结构型模式(如装饰器模式、代理模式等),行为型(如:观察者模式、迭代器模式等);今天我们讲的是工厂模式,其分为工厂方法模式、抽象工厂模式、简单工厂模式,好的,我们一步一步来分析。

简单工厂模式

来来来,我们从简单的开始。 简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例 类图: 苹果和梨都是继承植物

代码:

class Plant {constructor (name) {this.name = name}grow () {console.log('我有生长的功能哦~~')}
}
class Apple extends Plant {constructor (name, color) {super(name)this.color = colorconsole.log(this.color)}
}
class Pear extends Plant {constructor (name, color) {super(name)this.color = colorconsole.log(this.color)}
}
new Apple('苹果', '红色')
new Pear('梨子', '黄色')// 经典案例-那些年一起用过的jquery
class jQuery{constructor(selector){let elements = Array.from(document.querySelectorAll(selector));let length = elements?elements.length:0;for(let i=0;i<length;i++){this[i]=elements[i];}this.length = length;}html(){}
}
window.$ = function(selector){return new jQuery(selector);
}
复制代码

简单工厂的好处在于,我们可以在不动之前原逻辑的基础上,继承和拓展新的功能,这样我们就可以提高效率,之前大神写好的功能可以复用,而且可以站在巨人的肩膀上,不断拓展。当然,其实这些你们平时应该都有写过或者用过,只是现在由一个名词规范起来,是不是觉得突然高大尚了。 上面代码直接new 的缺点是,耦合和依赖于具体的实现。

工厂方法模式

同先上个类图,需求变了需要添加个橘子:

上代码:

class Plant{constructor(name) {this.name=name;}grow() {console.log('growing~~~~~~');    }
}
class Apple extends Plant{constructor(name, color) {super(name);this.color = color}
}
class Orange extends Plant{constructor(name, color) {super(name);this.color = color}
}
class AppleFactory{create() {return new Apple('苹果','红色');}
}
class OrangeFactory{create() {return new Orange('桔子', '橙色');}
}
const settings={'apple': AppleFactory,'orange':OrangeFactory
}
let apple=new settings['apple']().create();
console.log(apple);
let orange=new settings['orange']().create();
console.log(orange);
复制代码

这样写的好处是我们可以随意添加不同的水果,我们不用关心如何实现,新增同一个水果类,拿来就用,还有一个好处就是,假如AppleFactory有改动新增新的功能,但是引用的地方很多,我们只需要新增一个AppleFactory,修改不影响老代码。 上面的代码修改一下,引入类似于java接口概念

class Plant{constructor(name) {this.name=name;}grow() {console.log('growing~~~~~~');    }
}
// 新增Factory
class Factory {create() { }
}
class Apple extends Plant{constructor(name, color) {super(name);this.color = color}
}
class Orange extends Plant{constructor(name, color) {super(name);this.color = color}
}
// 子类继承父类 并实现create 方法
class AppleFactory extends Factory{static create() {return new Apple('苹果','红色');}
}
class OrangeFactory extends Factory{static create() {return new Orange('桔子', '橙色');}
}
// 通过配置文件来解耦合
const settings={'apple': AppleFactory,'orange':OrangeFactory
}
let apple=new settings['apple']().create();
console.log(apple);
let orange=new settings['orange']().create();
console.log(orange);
复制代码

说明一下类Factory

  • 工厂一般是接口,规定子类必须实现的方法
  • 依赖抽象,而不依赖实现
  • 接口只有方法定义,没有具体实现,如果一个类要实现该接口,就必须实现该接口中的所有方法

抽象工厂模式

抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式 抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象.

为了好展示我们来举个例子:比如现在用java来写个软件要运行在不同系统window、mac等,但是他们的icon和button是不同的

类图

代码

class Factory {// 公共的方法是有一定的关联createButton() {//创建按钮}createIcon() {// 创建图标}
}
class Icon { }
class AppleIcon {render() {console.log(`绘制苹果图标`)}
}
class WindowsIcon {render() {console.log(`绘制window图标`)}
}
class Button { }
class AppleButton {render() {console.log(`绘制苹果按钮`)}
}
class WindowsButton {render() {console.log(`绘制windows按钮`)}
}
class AppleFactory extends Factory {createButton() {//创建按钮return new AppleButton();}createIcon() {// 创建图标return new AppleIcon();}
}
class WindowsFactory extends Factory {createButton() {//创建按钮return new WindowsButton();}createIcon() {// 创建图标return new WindowsIcon();}
}
/*** Java是跨平台的* 1.画一个图标* 2.画一个按钮*/
let windowsFactory = new WindowsFactory();
windowsFactory.createIcon().render();
windowsFactory.createButton().render();
//=========================================
let appleFactory = new AppleFactory();
appleFactory.createIcon().render();
appleFactory.createButton().render();
复制代码

小结

  1. 简单工厂 一般就是一个函数返回产品的实例 (最常用,使用最多)
  2. 工厂方法 多了工厂类,要想创建产品,需要先创建此工厂的实例,再通过此工厂来创建产品。(少用)
  3. 在抽象工厂中,一个工厂可以创建多种产品 (基本不用) 看到这里了,你们的点赞是我动力~~

补充知识点-类图

  • 用于描述系统中的对象类本身的组成和对象类之间的各种静态关系
  • 类之间的关系:依赖、泛化(继承)、 实现、关联、聚合和组合 这里主要讲类图的依赖、泛化(继承)、

依赖关系(Dependence)

只要在类中用到了对方,那么它们之间就存在依赖关系,如果没有对方,连编译都通过不了, 通俗的说就是 比如 动物 依赖于水和空气,下面为类图: 由三部分组成,类的名字、类的属性、类的方法。 依赖关系由虚线空心箭头表示

泛化关系(Generalization)

泛化关系实际上就是继承关系,他就是依赖关系的特例, 泛化关系由实线空心箭头表示

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

前端设计模式(1)--工厂模式相关推荐

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

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

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

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

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

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

  4. 策略模式和工厂模式的区别_设计模式之工厂模式-工厂方法模式

    设计模式之工厂模式-工厂方法模式 大家好,欢迎来到污污弹公司,今天司小司又接到了一个新活-披萨项目. 来源:凯哥Java(kaigejava) 需求: 披萨项目: 要方便披萨品种的扩展.要便于维护.要 ...

  5. Java 设计模式之工厂模式(二)

    原文地址:Java 设计模式之工厂模式(二) 博客地址:http://www.extlight.com 一.背景 本篇内容是 Java 设计模式创建型模式的第二篇.上一篇主题为 <Java 设计 ...

  6. 设计模式之工厂模式(三)

    上一次我们已经通过代码,简单的认识了工厂方法模式,具体的思路请移步到设计模式之工厂模式(二),进行查看.这次,让我们通过设计模式的思想,来好好认识下工厂方法模式. 创建者和产品 所有工厂模式都用来封装 ...

  7. php工厂模式和单例模式,php 设计模式之工厂模式、单例模式、注册树模式

    php 设计模式之工厂模式.单例模式.注册树模式 在软件工程中,创建型设计模式承担着对象创建的职责,尝试创建适合程序上下文的对象,对象创建设计模式的产生是由于软件工程设计的问题,具体说是向设计中增加复 ...

  8. 教你如何一篇博客读懂设计模式之—--工厂模式

    一篇博客读懂设计模式之-工厂模式 工厂模式在我们日常开发的时候经常用到,相信大家都有了一定的了解,工厂模式是一种创建对象的设计模式,它提供一种创建对象的最佳方式. 主要过程是: 定义一个创建对象的接口 ...

  9. 一篇博客读懂设计模式之---工厂模式

    设计模式之-工厂模式 工厂模式: 创建过程: 创建Shape接口 public interface Shape {void draw(); } 创建实现类: public class Circle i ...

  10. java 工厂模式详解_Java设计模式之工厂模式详解

    简单工厂其实并不是设计模式,只是一种编程习惯. 首先我们创建父类Cup,所有杯子类的父类.再创建它的子类BigCup和SmallCup类. public abstract class Cup { pu ...

最新文章

  1. python制作统计图_刻意练习11:Python描述统计、简单统计图形
  2. Adobe与Facebook联手推出Flash开发工具
  3. WP7进阶】——XNA游戏平面矩形碰撞检测
  4. OpenCASCADE绘制测试线束:拓扑命令之曲线和曲面拓扑
  5. hibernate自定义校验器使用(字段在in范围之内)
  6. phpcmsV9框架:安装教程
  7. 心中无敌,则天下无敌
  8. 李宏毅自然语言处理——Self Attention
  9. 一个网卡设备配置两个不同网段的IP地址
  10. mysql 重启爆红,MySQL 启动报错
  11. 张口就来!国家java认证考试报名入口
  12. 绝地求生鼠标宏怎么设置?
  13. 中国近代史纲要 期末复习
  14. 站在巨人的肩膀上谈-计算机视觉走向未来
  15. windows 网络监控_如何在Windows 10中监控网络使用情况
  16. 年轻人千万别让老司机把你带到坑里
  17. divi 相关主题推荐
  18. unity实现对话控制
  19. 基于Python Django实现Prometheus Exporter
  20. 如何快速的安装cnpm

热门文章

  1. 阶段1 语言基础+高级_1-3-Java语言高级_05-异常与多线程_第3节 线程同步机制_8_解决线程安全问题_Lock锁...
  2. 修改PHP上传文件的大小限制(post)
  3. 《CoderXiaoban》第九次团队作业:Beta冲刺与验收准备1
  4. 这次聊聊Promise对象
  5. 当多个类之间有继承关系时,创建子类对象会导致父类初始化块的执行。
  6. Android Butterknife框架 注解攻略
  7. Mysql insert without auto-increase when duplicate
  8. 一步步学习SPD2010--附录A--SPD工作流条件和操作(4)--列表操作
  9. NOIP2015题解
  10. Sublime Text 2安装图解