我以计算器为例写一个简单工厂模式,只完成加减乘除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简单工厂的更多相关文章

  1. JS 简单工厂模式,工厂模式(二)

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

  2. JS设计模式--简单工厂模式

    在JS中创建对象会习惯的使用new关键字和类构造函数(也是可以用对象字面量). 工厂模式就是一种有助于消除两个类依赖性的模式. 工厂模式分为简单工厂模式和复杂工厂模式,这篇主要讲简单工厂模式. 简单工 ...

  3. js原生设计模式——3简单工厂模式\简单工厂模式封装简单对象

    1.Factory基本写法 <!DOCTYPE html><html lang="en"><head>    <meta charset= ...

  4. 【JS设计模式】温习简单工厂模式、工厂方法模式、抽象工厂模式概念

    注:空心箭头表示的是种继承关系,工厂类和产品类之间是一种依赖关系.是用箭头加虚线表示的,以下的模型图是用的实线是不正确(时间不够用,在这里我偷懒了.这个习惯不好,呵呵) 简单工厂模式(Simple F ...

  5. Jquery如何序列化form表单数据为JSON对象 C# ADO.NET中设置Like模糊查询的参数 从客户端出现小于等于公式符号引发检测到有潜在危险的Request.Form 值 jquery调用iframe里面的方法 Js根据Ip地址自动判断是哪个城市 【我们一起写框架】MVVM的WPF框架(三)—数据控件 设计模式之简单工厂模式(C#语言描述)

    jquery提供的serialize方法能够实现. $("#searchForm").serialize();但是,观察输出的信息,发现serialize()方法做的是将表单中的数 ...

  6. JS常用的设计模式(2)——简单工厂模式

    简单工厂模式是由一个方法来决定到底要创建哪个类的实例, 而这些实例经常都拥有相同的接口. 这种模式主要用在所实例化的类型在编译期并不能确定, 而是在执行期决定的情况. 说的通俗点,就像公司茶水间的饮料 ...

  7. 《JS设计模式笔记》 2,简单工厂模式

    <script type="text/javascript"> //简单工厂模式 //定义:由一个方法来决定到底要创建哪个类的实例,而这些实例经常拥有相同的接口.其实例 ...

  8. js简单的工厂模式

    <!DOCTYPE html> <html> <head> <title></title> </head> <body&g ...

  9. js之简单工厂模式

    简单工厂模式是由一个方法来决定到底要创建哪个类的实例, 而这些实例经常都拥有相同的接口. 这种模式主要用在所实例化的类型在编译期并不能确定, 而是在执行期决定的情况. 说的通俗点,就像公司茶水间的饮料 ...

随机推荐

  1. android 手机设置铃声

    和应用程序相比,普通用户在初初接触智能手机时最先反而会对多媒体功能产生兴趣,尤其是铃声.壁纸设定之类个性化功能,更是让不少追求时尚的年轻人乐此不疲.对于Android手机来说,其铃声.图片的个性化空间 ...

  2. 数据库之MySQL(三)

    视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当作表来使用. 临时表搜索 SELECT   *FRO ...

  3. A SELECT statement that assigns a value to a variable must ... (向变量赋值的 SELECT 语句不能与数据检索操作结合使用 )

    A SELECT statement that assigns a value to a variable must ... (向变量赋值的 SELECT 语句不能与数据检索操作结合使用 ) 总结一句 ...

  4. End to End 端到端

    在DeepLearning的文章中有看到end2end一次,作者们似乎都比较喜欢这个end2end learning的方式.那么到底啥是end2end? 找了一下相关论文,没找到专门讲这个概念的,看来 ...

  5. (转)js原生自定义事件的触发dispatchEvent

    1. 对于标准浏览器,其提供了可供元素触发的方法:element.dispatchEvent(). 不过,在使用该方法之前,我们还需要做其他两件事,及创建和初始化.因此,总结说来就是: 1 2 3 d ...

  6. socket()模块和套接字对象的内建方法

    一.socket()模块函数 要使用socket.socket()函数来创建套接字,其语法如下: socket(socket_family,socket_type,protocol=0) 如上所述,s ...

  7. C#中字符串的内存分配与驻留池

    完全引用http://www.cnblogs.com/instance/archive/2011/05/24/2056091.html 驻留池:是一张记录了所有在代码中使用字面量声明的字符串实例的引用 ...

  8. width

    position:absolute 其widht:%是想对于最近的已经定位的父元素,如果没有就想对于body widht 是指的内容区的with,设置除了width其他的元素都会使元素变的比width ...

  9. Loadrunder脚本篇——Run-time Settings之Miscellaneous

    作用说明 提供混杂设置,如错误处理,多线程,自动化事务设置等 注意:仅对指定协议有效   Error Handling Continue on Error 开启后,在VuGen中,如脚本中某个函数出错 ...

  10. java基础—— Collections.sort的两种用法

    package com.jabberchina.test; import java.util.ArrayList; import java.util.Collections; import java. ...