ES6对抽象工厂模式与策略模式结合的实践
这段代码是我在学习了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对抽象工厂模式与策略模式结合的实践的更多相关文章
- 设计模式02: Abstract Factory 抽象工厂(创建型模式)
Abstract Factory 抽象工厂(创建型模式) 常见的对象创建方法: //创建一个Road对象 Road road=new Road(); new的问题: -实现依赖 ...
- 策略模式、策略模式与Spring的碰撞
策略模式是GoF23种设计模式中比较简单的了,也是常用的设计模式之一,今天我们就来看看策略模式. 实际案例 我工作第三年的时候,重构旅游路线的机票查询模块,旅游路线分为四种情况: 如果A地-B地往返都 ...
- 模式PK:命令模式VS策略模式
1.概述 命令模式和策略模式的类图确实很相似,只是命令模式多了一个接收者(Receiver)角色.它们虽然同为行为类模式,但是两者的区别还是很明显的.策略模式的意图是封装算法,它认为“算法”已经是一个 ...
- C++模式学习------策略模式
当遇到同一个对象有不同的行为,方法,为管理这些方法可使用策略模式. 策略模式就是对算法进行包装,是把使用算法的责任和算法本身分割开来.通常把一个系列的算法包装到一系列的策略类里面,这些类继承一个抽象的 ...
- 【设计模式】 模式PK:命令模式VS策略模式
1.概述 命令模式和策略模式的类图确实很相似,只是命令模式多了一个接收者(Receiver)角色.它们虽然同为行为类模式,但是两者的区别还是很明显的.策略模式的意图是封装算法,它认为“算法”已经是一个 ...
- Provider Pattern提供者模式和策略模式
http://www.codeproject.com/Articles/18222/Provider-Pattern Introduction Provider pattern is one of t ...
- Android设计模式之命令模式、策略模式、模板方法模式
命令模式是其它很多行为型模式的基础模式.策略模式是命令模式的一个特例,而策略模式又和模板方法模式都是算法替换的实现,只不过替换的方式不同.下面来谈谈这三个模式. 命令模式 将一个请求封装为一个对象,从 ...
- 我学的是设计模式的视频教程——命令模式vs策略模式,唠嗑
课程视频 命令模式vs策略模式 唠嗑 课程笔记 课程笔记 课程代码 课程代码 新课程火热报名中 课程介绍 版权声明:本文博主原创文章,博客,未经同意不得转载.
- 大型Java进阶专题(七) 设计模式之委派模式与策略模式
前言 今天开始我们专题的第七课了.本章节将介绍:你写的代码中是否觉得很臃肿,程序中有大量的if...else,想优化代码,精简程序逻辑,提升代码的可读性,这章节将介绍如何通过委派模式.策略模式让你 ...
随机推荐
- More Effective C++ 35 条款
一.基础议题(basics) 条款1:仔细区别 pointers 和 references(Distinguish between pointers and references) 一个基本的语法问题 ...
- golang中的接口实现(一)
golang中的接口实现 // 定义一个接口 type People interface { getAge() int // 定义抽象方法1 getName() string // 定义抽象方法2 } ...
- SQLServer 里面的 DDL,DML,DCL,TCL
1.DDL (Data Definition Language )数据库定义语言 statements are used to define the database structure or sch ...
- Asp.net core WebApi 使用Swagger生成帮助页实例
最近我们团队一直进行.net core的转型,web开发向着前后端分离的技术架构演进,我们后台主要是采用了asp.net core webapi来进行开发,开始每次调试以及与前端人员的沟通上都存在这效 ...
- 记录怎样把安全证书导入到java中的cacerts证书库
这次项目上需要去证书中解析公钥所以这里分享下方法: 首先准备一个证书文件比如叫:test.crt(一般是cer结尾) 下一步准备把证书导入到导入java中的cacerts证书库里 方法如下: 比如本地 ...
- Java基础——ArrayList与LinkedList(二)
今天练习ArrayList与LinkedList,在网上看到有关它俩应用效率的题型.觉得很有价值,保留一下. import java.util.ArrayList; import java.util. ...
- Oracle总结之plsql编程(基础九)
原创作品,转自请注明出处:https://www.cnblogs.com/sunshine5683/p/10344302.html 接着上次总结,继续今天的总结,今天主要总结plsql中控制语句,如条 ...
- Linux常用基本命令(split )
split命令 作用:切割文件 格式: split [option] [input] [prefix] -l 指定分割后文件的最大行数 ghostwu@dev:~/linux/split$ cat - ...
- css 中可以继承的属性
CSS中可以和不可以继承的属性一.无继承性的属性 1.display:规定元素应该生成的框的类型 2.文本属性: vertical-align:垂直文本对齐 text-decoration:规定添加到 ...
- Nginx的日志优化
1.日志轮询切割: 这篇文章已经对日志轮询切割做个介绍:请点击这里 2.不记录不需要的日志 在实际的工作中,对于负载均衡器健康节点检查或某些特定文件的日志,一般不需要记录下来,因为统计PV是按照页面计 ...