js简单工厂

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

先看一下C#的简单工厂是如何实现的:

定义抽象类Operation,加减乘除的实现由子类派生,最后由OperationFactory决定实例化哪一个子类。

namespace OperationLibrary
{
    public abstract class Operation
    {
        private int num_A = 0;
        public int Num_A
        {
            get { return num_A; }
            set { num_A = value; }
        }

        private int num_B = 0;
        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 == 0)
                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 = 6;
oper.Num_B = 2;
oper.getResult(); //3

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()); //3

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, 基本上不需要修改程序的内部方法,而是为它增加扩展,基本符合开放-封闭原则。

时间: 2024-10-15 13:42:36

js简单工厂的相关文章

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

注:空心箭头表示的是种继承关系,工厂类和产品类之间是一种依赖关系.是用箭头加虚线表示的,以下的模型图是用的实线是不正确(时间不够用,在这里我偷懒了.这个习惯不好,呵呵) 简单工厂模式(Simple Factory Pattern): 使用一个类(通常为单体)来创建实例;简单工厂模式也叫静态工厂方法模式(Static FactoryMethod Pattern). 接口的定义通常是以I开头标识符,在JS中未定义接口或抽象类的语法: var MacBikeFactory = { createBike

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

简单工厂模式是由一个方法来决定到底要创建哪个类的实例, 而这些实例经常都拥有相同的接口. 这种模式主要用在所实例化的类型在编译期并不能确定, 而是在执行期决定的情况. 说的通俗点,就像公司茶水间的饮料机,要咖啡还是牛奶取决于你按哪个按钮. 简单工厂模式在创建ajax对象的时候也非常有用. 这个库里提供了几种ajax请求的方式,包括xhr对象的get, post, 也包括跨域用的jsonp和iframe. 为了方便使用, 这几种方式都抽象到了同一个接口里面. 1 var request1 = Re

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

在JS中创建对象会习惯的使用new关键字和类构造函数(也是可以用对象字面量). 工厂模式就是一种有助于消除两个类依赖性的模式. 工厂模式分为简单工厂模式和复杂工厂模式,这篇主要讲简单工厂模式. 简单工厂模式:使用一个类来生成实例. 复杂工厂模式:使用子类来决定一个成员变量应该是哪个具体的类的实例. 简单工厂模式: 常用对象方法创建和调用 var BallShop = function(){}; BallShop.prototype = { sellBall : function(model){

js之简单工厂模式

简单工厂模式是由一个方法来决定到底要创建哪个类的实例, 而这些实例经常都拥有相同的接口. 这种模式主要用在所实例化的类型在编译期并不能确定, 而是在执行期决定的情况. 说的通俗点,就像公司茶水间的饮料机,要咖啡还是牛奶取决于你按哪个按钮. e.g. var BicycleShop = function(){}; BicycleShop.prototype = { sellBicycle : function( model ){ var bicycle; switch( model ){ case

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

1 <script type="text/javascript"> 2 //简单工厂模式 3 //定义:由一个方法来决定到底要创建哪个类的实例,而这些实例经常拥有相同的接口.其实例在编译的时候不确定,而是在执行的时候确定. 4 var request1=Request("cgi.xx.com/xxx","get"); 5 request1.start(); 6 request1.done(fn); 7 var request2=Req

使用javascript完成一个简单工厂设计模式。

在JS中创建对象会习惯的使用new关键字和类构造函数(也是可以用对象字面量). 工厂模式就是一种有助于消除两个类依赖性的模式. 工厂模式分为简单工厂模式和复杂工厂模式,这篇主要讲简单工厂模式. 简单工厂模式:使用一个类来生成实例. 复杂工厂模式:使用子类来决定一个成员变量应该是哪个具体的类的实例. 简单工厂模式: 常用对象方法创建和调用 var BallShop = function(){}; BallShop.prototype = { sellBall : function(model){

工厂模式一之简单工厂

工厂用来生产商品,然后卖给供应商,再由供应商转手给门店,再卖给顾客 .这样的一种生产到供应的过程,看看如何应用到我们的程序中. 1.下面以衣服店为例子. 第一步 clothes.js //创建一个衣服店模型. var ClothesShop = function (){} ClothesShop.prototype = { sellClothes: function (color){ var clothesType = ['Red', 'Blue', 'Yello', 'Green', 'Gra

闭包 构建函数 简单工厂模式

今天收获比较多,仿佛无意中打通了七筋八脉,想通了一些原理性的东西.对js有了更深的理解. 首先说说闭包,闭包在我们实际开发中处处被用到,那个它到底是个什么东西呢? var user=(function(){ var USER={ name:"mapleTao", password:"123456" } return { getName:function(){ return USER.name; }, getPassword:function(){ return US

JS之工厂模式

1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>工厂模式</title> 6 </head> 7 <body> 8 <script> 9 //让我们决定通过厂长告诉做什么事情,不需了解内部 10 /*模式作用: 11 1,对象的构建十分复杂,可以用此