js简单工厂
我以计算器为例写一个简单工厂模式,只完成加减乘除4个计算功能,考虑到其他功能方便日后扩展,遵循开放-封闭原则。
简单工厂类图:

先看一下C#的简单工厂是如何实现的:
定义抽象类Operation,加减乘除的实现由子类派生,最后由OperationFactory决定实例化哪一个子类。
namespace OperationLibrary
{
public abstract class Operation
{
private int num_A = ;
public int Num_A
{
get { return num_A; }
set { num_A = value; }
} private int num_B = ;
public int Num_B
{
get { return num_B; }
set { num_B = value; }
} public abstract double getResult();
} public class OperationAdd : Operation
{
public override double getResult()
{
return Num_A + Num_B;
}
} public class OperationSub : Operation
{
public override double getResult()
{
return Num_A - Num_B;
}
} public class OperationMul : Operation
{
public override double getResult()
{
return Num_A * Num_B;
}
} public class OperationDiv : Operation
{
public override double getResult()
{
if (Num_B == )
throw new Exception("除数不能为0");
return Num_A / Num_B;
}
} public class OperationFactory
{
public static Operation createOperate(string operate)
{
Operation oper = null;
switch (operate)
{
case "+":
oper = new OperationAdd();
break;
case "-":
oper = new OperationSub();
break;
case "*":
oper = new OperationMul();
break;
case "/":
oper = new OperationDiv();
break;
}
return oper;
}
}
}
客户端调用:
Operation oper = OperationFactory.createOperate("/");
oper.Num_A = ;
oper.Num_B = ;
oper.getResult(); //
js模拟C#的简单工厂:
var Operation = function(){
this.num_A = this.num_B = 0;
};
var OperationAdd = function(){};
OperationAdd.prototype = new Operation();
OperationAdd.prototype.getResult = function(){
return this.num_A + this.num_B;
};
var OperationSub = function(){};
OperationSub.prototype = new Operation();
OperationSub.prototype.getResult = function(){
return this.num_A - this.num_B;
};
var OperationMul = function(){};
OperationMul.prototype = new Operation();
OperationMul.prototype.getResult = function(){
return this.num_A * this.num_B;
};
var OperationDiv = function(){};
OperationDiv.prototype = new Operation();
OperationDiv.prototype.getResult = function(){
if(this.num_B == 0)
throw new Error('除数不能为0');
return this.num_A / this.num_B;
};
var OperateFactory = function(){};
OperateFactory.createOperate = function(operate){
var oper;
switch(operate){
case "+":
oper = new OperationAdd();
break;
case "-":
oper = new OperationSub();
break;
case "*":
oper = new OperationMul();
break;
case "/":
oper = new OperationDiv();
break;
}
return oper;
};
//调用:
var oper = OperateFactory.createOperate('+');
oper.num_A = 1;
oper.num_B = 2;
alert(oper.getResult()); //
js完全照搬C#的模式显然太复杂,根据js语言的特性实现一个:
var Operation = function(){
this.num_A = this.num_B = 0;
};
Operation.prototype.OperationAdd = function(){
return this.num_A + this.num_B;
};
Operation.prototype.OperationSub = function(){
return this.num_A - this.num_B;
};
Operation.prototype.OperationMul = function(){
return this.num_A * this.num_B;
};
Operation.prototype.OperationDiv = function(){
if(this.num_B == 0)
throw new Error('除数不能为0');
return this.num_A / this.num_B;
};
//策略
var operateStrategy = {
'+':'OperationAdd',
'-':'OperationSub',
'*':'OperationMul',
'/':'OperationDiv'
};
//工厂
var OperateFactory = (function(){
var oper;
return function(operate){
//只实例化一次
oper = oper || new Operation();
return {
setNumber:function(a,b){
oper.num_A = a;
oper.num_B = b;
},
getResult:function(){
var fName = operateStrategy[operate],
fun = oper[fName] || function(){};
return fun.call(oper);
}
};
};
})();
//调用:
var oper = OperateFactory('+');
oper.setNumber(1,3);
alert(oper.getResult());
oper = OperateFactory('*');
oper.setNumber(2,3);
alert(oper.getResult());
总结:如果日后需要扩展计算器的功能,我们需要维护2个地方,一个是为Operation的原型添加所需要的新功能,另一个是维护策略对象:operateStrategy, 基本上不需要修改程序的内部方法,而是为它增加扩展,基本符合开放-封闭原则。我认为只要对面向对象编程思想有所了解,都能写出简单工厂模式,使用场景无需考虑因为在编码过程中这是一件很自然的事情,他简单到都不能算是一个模式。
js简单工厂的更多相关文章
- JS 简单工厂模式,工厂模式(二)
一.什么是工厂模式: 工厂模式就是用来创建对象的一种最常用的设计模式,我们不暴露创建对象的具体逻辑,而是将逻辑封装到一个函数中,那么,这个函数 就可以被视为一个工厂.那么,在实际项目中,我们是不是可以 ...
- JS设计模式--简单工厂模式
在JS中创建对象会习惯的使用new关键字和类构造函数(也是可以用对象字面量). 工厂模式就是一种有助于消除两个类依赖性的模式. 工厂模式分为简单工厂模式和复杂工厂模式,这篇主要讲简单工厂模式. 简单工 ...
- js原生设计模式——3简单工厂模式\简单工厂模式封装简单对象
1.Factory基本写法 <!DOCTYPE html><html lang="en"><head> <meta charset= ...
- 【JS设计模式】温习简单工厂模式、工厂方法模式、抽象工厂模式概念
注:空心箭头表示的是种继承关系,工厂类和产品类之间是一种依赖关系.是用箭头加虚线表示的,以下的模型图是用的实线是不正确(时间不够用,在这里我偷懒了.这个习惯不好,呵呵) 简单工厂模式(Simple F ...
- Jquery如何序列化form表单数据为JSON对象 C# ADO.NET中设置Like模糊查询的参数 从客户端出现小于等于公式符号引发检测到有潜在危险的Request.Form 值 jquery调用iframe里面的方法 Js根据Ip地址自动判断是哪个城市 【我们一起写框架】MVVM的WPF框架(三)—数据控件 设计模式之简单工厂模式(C#语言描述)
jquery提供的serialize方法能够实现. $("#searchForm").serialize();但是,观察输出的信息,发现serialize()方法做的是将表单中的数 ...
- JS常用的设计模式(2)——简单工厂模式
简单工厂模式是由一个方法来决定到底要创建哪个类的实例, 而这些实例经常都拥有相同的接口. 这种模式主要用在所实例化的类型在编译期并不能确定, 而是在执行期决定的情况. 说的通俗点,就像公司茶水间的饮料 ...
- 《JS设计模式笔记》 2,简单工厂模式
<script type="text/javascript"> //简单工厂模式 //定义:由一个方法来决定到底要创建哪个类的实例,而这些实例经常拥有相同的接口.其实例 ...
- js简单的工厂模式
<!DOCTYPE html> <html> <head> <title></title> </head> <body&g ...
- js之简单工厂模式
简单工厂模式是由一个方法来决定到底要创建哪个类的实例, 而这些实例经常都拥有相同的接口. 这种模式主要用在所实例化的类型在编译期并不能确定, 而是在执行期决定的情况. 说的通俗点,就像公司茶水间的饮料 ...
随机推荐
- Linux 入门介绍
背景:最近在搞redis 集群 ,然后有时候会怀疑自己,那么问题来了, 怀疑自己就是自己不扎实! 记忆不好了! 写下来备份吧! 才入门时候总是会想 ,Linux 下面文件夹都是什么意思! bin ...
- 以层的观点思考各个nginx的log位置
问题 做代理服务器时候,自身的log.被代理的服务器的log 回答 以层的观点思考这个问题 各层的日志落在各层
- 分布式缓存的一致性Hash算法 2 32
w 李智慧
- docker related,docker history
History of an image and size of layers: docker history --no-trunc=true zabbix/zabbix-3.0 | tr -s ' ' ...
- Server Objects Extension(SOE)开发(二)
前言 SOE的提供了REST和Soap两种模板,只要在模板特定的方法中添加自己的业务逻辑代码即可,开发流程非常的简单便捷.那怎么知道自己的业务逻辑代码该写在模板的那个方法里面呢?这就需要很好的理解SO ...
- QCache 缓存(模板类,类似于map,逻辑意义上的缓存,方便管理,和CPU缓存无关。自动获得被插入对象的所有权,超过一定数量就会抛弃某些值)
在软件开发中,我们经常需要在内存中存储一些临时数据用于后续相关计算.我们一般把这些数据存储到某个数组里,或者STL中的某个合适的容器中.其实,在Qt中直接为我们提供了一个QCache类专用于这种需求. ...
- ABAP 断点篇-001
断点技能不足! 6.2.4 可在调试画面设置break-point.方法:在代码前面双击 6.2.5 为指定语句设置断点方法:(1)选择菜单:Breakpoints->Breakpointat ...
- seaborn(matplotlib)画图,linux系统中文乱码等问题解决
data = pd.read_json(json.dumps(issue_dpl)) # set pic size plt.figure(figsize=(13, 5)) sns.set_style( ...
- 解决PowerDesigner 反向工程没有注释(备注)
1. 列注释 原来代码: {OWNER, TABLE, S, COLUMN, DTTPCODE, LENGTH, SIZE, PREC, COMPUTE, NOTNULL, IDENTITY, DOM ...
- 20160418 while,switch,do..while的使用
9 一.While循环 示例:求100以内所有数的和 Int i=1;//初始条件 Int sum=0; While(i<=100)//循环条件 { Sum+=i;//循环体 i++;//状态改 ...