这段代码是我在学习了java版的抽象工厂模式后,实现的ES6版抽象工厂,后期大幅修改,加入了策略模式,看起来很多逻辑看似繁琐,不必要写这么多,但是为了练习设计模式,所以才这样做。当所需的工厂种类增多后,以及需要频繁修改子工厂时,这样抽象工厂模式与策略模式的结合就会发挥巨大的优势,后期维护简单,耦合性低,便于统计子类型等。

/*   使用策略模式,来将具体的工厂类型进行封装,然后便于后期添加新的工厂,而不用修改原有的代码
* 只需要写出新的工厂类,并使用addClass方法进行添加,及可方便的得到工厂,并生产
* 可以通过对factoryList这个实例对象进行查询,即可知道有哪些工厂类型可以进行工作
*/ // 定义钢笔厂
class PenFactory{
constructor(penColor){
this.penColor = penColor;
}
produce(penNum){
console.log(`生产了${penNum}只${this.penColor}颜色的笔`);
}
}
// 定义纸厂
class PaperFactory{
constructor(paperColor){
this.paperColor = paperColor;
}
produce(paperNum){
console.log(`生产了${paperNum}张${this.paperColor}颜色的纸`);
}
}
// 定义手机厂
class PhoneFactory{
constructor(weight){
this.weight = weight;
}
produce(num){
console.log(`生产了${num}个${this.weight}重的手机`);
}
} // 定义工厂列表类,实现抽象工厂模式,以及策略模式结合使用
class FactoryList{
constructor(){
// 用于保存不同的策略名称,及对应的方案
this.strateges = {};
}
addClass(factoryClass){
// new 后要跟真正的类不能是类名的字符串,这里接收的参数是真正的类,使用它的name属性获取类名
this.strateges[factoryClass.name] = function(config){return new factoryClass(config)};
}
getFactory(className,config){
return this.strateges[className].call(null,config);
}
}
var factoryList = new FactoryList(); factoryList.addClass(PhoneFactory); // 这里的Phone是真正的类,不是字符串类名
factoryList.addClass(PenFactory);
factoryList.addClass(PaperFactory); // NOTE: 这里定义我自己的工厂,由我决定生存哪些产品,以及有什么工厂
var myFactory = {};
var phoneF = factoryList.getFactory('PhoneFactory','500g');
var penF = factoryList.getFactory('PenFactory','红色');
var paperF = factoryList.getFactory('PaperFactory','A4');
// 这里要绑定那个具体的工厂类,借用this,确保我自己的厂子的某类具体的生产参数不出错
myFactory.producePhone = phoneF.produce.bind(phoneF);
myFactory.producePen = penF.produce.bind(penF);
myFactory.producePaper = paperF.produce.bind(paperF);
myFactory.producePhone(10); // 生产了10个500g重的手机
myFactory.producePen(20); // 生产了20只红色颜色的笔
myFactory.producePaper(30); // 生产了30张A4颜色的纸

ES6对抽象工厂模式与策略模式结合的实践的更多相关文章

  1. 设计模式02: Abstract Factory 抽象工厂(创建型模式)

    Abstract Factory 抽象工厂(创建型模式) 常见的对象创建方法:    //创建一个Road对象    Road road=new Road();    new的问题:    -实现依赖 ...

  2. 策略模式、策略模式与Spring的碰撞

    策略模式是GoF23种设计模式中比较简单的了,也是常用的设计模式之一,今天我们就来看看策略模式. 实际案例 我工作第三年的时候,重构旅游路线的机票查询模块,旅游路线分为四种情况: 如果A地-B地往返都 ...

  3. 模式PK:命令模式VS策略模式

    1.概述 命令模式和策略模式的类图确实很相似,只是命令模式多了一个接收者(Receiver)角色.它们虽然同为行为类模式,但是两者的区别还是很明显的.策略模式的意图是封装算法,它认为“算法”已经是一个 ...

  4. C++模式学习------策略模式

    当遇到同一个对象有不同的行为,方法,为管理这些方法可使用策略模式. 策略模式就是对算法进行包装,是把使用算法的责任和算法本身分割开来.通常把一个系列的算法包装到一系列的策略类里面,这些类继承一个抽象的 ...

  5. 【设计模式】 模式PK:命令模式VS策略模式

    1.概述 命令模式和策略模式的类图确实很相似,只是命令模式多了一个接收者(Receiver)角色.它们虽然同为行为类模式,但是两者的区别还是很明显的.策略模式的意图是封装算法,它认为“算法”已经是一个 ...

  6. Provider Pattern提供者模式和策略模式

    http://www.codeproject.com/Articles/18222/Provider-Pattern Introduction Provider pattern is one of t ...

  7. Android设计模式之命令模式、策略模式、模板方法模式

    命令模式是其它很多行为型模式的基础模式.策略模式是命令模式的一个特例,而策略模式又和模板方法模式都是算法替换的实现,只不过替换的方式不同.下面来谈谈这三个模式. 命令模式 将一个请求封装为一个对象,从 ...

  8. 我学的是设计模式的视频教程——命令模式vs策略模式,唠嗑

    课程视频 命令模式vs策略模式 唠嗑 课程笔记 课程笔记 课程代码 课程代码 新课程火热报名中 课程介绍 版权声明:本文博主原创文章,博客,未经同意不得转载.

  9. 大型Java进阶专题(七) 设计模式之委派模式与策略模式

    前言 ​ 今天开始我们专题的第七课了.本章节将介绍:你写的代码中是否觉得很臃肿,程序中有大量的if...else,想优化代码,精简程序逻辑,提升代码的可读性,这章节将介绍如何通过委派模式.策略模式让你 ...

随机推荐

  1. IIS日志自动清理

    IIS在运行的过程中日志会不停地增长,若iis的网站被频繁的调用或不当的调用,则会产生很多日志.我在系统运维的时候曾出现过20G的系统盘,由于合作商开发的程序有问题,每几百微秒调用一次web服务,短期 ...

  2. asp.net的get和post请求

    asp.net的get和post请求 //获取第三方api的工具类 public class HttpUtils { public static string Get(string Url) { // ...

  3. JavaSE 集合补充点(JDK1.9对集合添加的优化)

    通常,我们在代码中创建一个集合(例如,List 或 Set ),并直接用一些元素填充它. 实例化集合,几个 add方法调用,使得代码重复. public class Demo01 { public s ...

  4. JavaScriptDay2-简单网页表单验证

    Html部分 <!-- 注册表单 1-用户名 text 2-密码 password 3-确认密码 password 4-性别 radio 5-爱好 hobby 6-籍贯 select-optio ...

  5. Navicat相关应用及注意事项

    一.MySQL数据类型 1.数值型 SMALLINT: 2个字节 INT: 4个字节      // age int(10) INTEGER:INT的同义词 BIGINT : 8个字节 FLOAT : ...

  6. Java虚拟机 - 类初始化

    [深入Java虚拟机]之三:类初始化 类初始化是类加载过程的最后一个阶段,到初始化阶段,才真正开始执行类中的Java程序代码.虚拟机规范严格规定了有且只有四种情况必须立即对类进行初始化: 遇到new. ...

  7. 基于react的标准form+table页面的请求流程图

    componentDidMount直接走handleSearch而不走loadData,是为了当form有默认初始值的时候也能适用! --------------------2018.2.7新增--- ...

  8. Java 根据出生日期计算年龄

    1.把出生日期字符串转换为日期格式. public static Date parse(String strDate) throws ParseException { SimpleDateFormat ...

  9. Maven安装本地jar包

    mvn install:install-file -DgroupId=com.oracle -DartifactId=ojdbc14 -Dversion=10.2.0.1.0 -Dpackaging= ...

  10. SQLServer 学习笔记之超详细基础SQL语句 Part 11

    Sqlserver 学习笔记 by:授客 QQ:1033553122 -----------------------接Part 10------------------- DECLARE @myavg ...