初学javascript设计模式(一)工厂模式第一遍阅读

本文详细介绍了工厂模式和简单工厂模式的概念、核心思想、使用案例及区别,包括允许和不允许除法的计算类、工厂类的实现方式以及继承抽象类的方法。通过对比实例,清晰展示了两种模式在实例化对象、构造函数重写等方面的不同。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
工厂模式
目录:
1、简单工厂模式
2、工厂模式
*/
//允许存在除法的计算类
var PermitDivide = function() {
    return {
        Sum: function() { alert("累加") },
        Subtract: function() { alert("递减") },
        Multiply: function() { alert("累乘") },
        Divide: function() { alert("除法") }
    }
}
//不允许存在除法的计算类
var NoPermitDivide = function() {
    return {
        Sum: function() { alert("累加") },
        Subtract: function() { alert("递减") },
        Multiply: function() { alert("累乘") }
    }
}
//工厂类
var CalculateFactory = {
    Newthis: function() {
        var i = arguments.length;
        var isReturnDivide = true;
        while (i-- && isReturnDivide) {
            if (!arguments[i]) {
                isReturnDivide = false;
            }
        }
        /*简单工厂的核心思想应该就是根据不同的条件实例化不同的对象*/
        if (isReturnDivide) {
            return new PermitDivide();
        }
        else {
            return new NoPermitDivide();
        }
    }
}

/*简单工厂模式*/
//计算类构造函数
var Calculate = function() { }
Calculate.prototype.Newthis = function() {
    return CalculateFactory.Newthis.apply(this, arguments);
}
var a = new Calculate().Newthis(1, 0);
var b = new Calculate().Newthis(1, 2);
//a.Sum(); //累加
//a.Divide(); //异常a.Divide is not a function
//b.Sum(); //累加
//b.Divide(); //累除
/*********************************************/





/*工厂模式*/
/*
计算抽象类
抽象类不允许直接实例化
*/
var CalculateAbs = function() { };
CalculateAbs.prototype.Newthis = function() {

};
CalculateAbs.prototype = {
    Newthis: function() {
        throw Error("派生类未实现构造函数");
        return this;
    },
    each: function() {
        for (var i in this) {
            alert(i);
        }
    }
}
/*
工厂模式与简单工厂模式的核心差别是
简单工厂是函数本身的构造函数通过另外一个方法(工厂)进行不同条件实例化不同类
而工厂模式却是对继承的抽象类的构造函数进行重写,每个继承了抽象类的函数都必须编写各自的构造函数
*/

/*继承抽象类并重写了构造函数*/
var Calculate1 = function() { }
Calculate1.prototype = new CalculateAbs()
Calculate1.prototype.Newthis = function() {
    var i = arguments.length;
    var isReturnDivide = true;
    while (i-- && isReturnDivide) {
        if (!arguments[i]) {
            isReturnDivide = false;
        }
    }
    if (isReturnDivide) {
        return new PermitDivide();
    }
    else {
        return new NoPermitDivide();
    }
}
//var a = new Calculate1().Newthis(1, 0);
//var b = new Calculate1().Newthis(1, 2);
//a.Sum(); //累加
//a.Divide(); //异常a.Divide is not a function
//a.each(); //异常a.eac is not a function //因为这个构造完全是构造了2个新类与继承类无关所以返回的对象未继承到each方法
//b.Sum(); //累加
//b.Divide(); //除法



/*继承抽象类,未重写抽象类*/
var Calculate2 = function() { }
Calculate2.prototype = new CalculateAbs()
//var a = new Calculate2().Newthis(1, 0);
//var b = new Calculate2().Newthis(1, 2);
//a.Sum(); //派生类未实现构造函数
//a.Divide(); //派生类未实现构造函数
//b.Sum(); //派生类未实现构造函数
//b.Divide(); //派生类未实现构造函数


/*继承抽象类并重写抽象类*/
var Calculate3 = function() { }
Calculate3.prototype = new CalculateAbs();
Calculate3.prototype.Newthis = function() {
    this.Divide = function() {
        alert("除法");
    }
    return this;
}
//var a = new Calculate3().Newthis(1, 0);
//var b = new Calculate3().Newthis(1, 2);
//a.Divide(); //除法
//b.Divide(); //除法
//a.each(); //遍历继承抽象

/*********************************************************/


有什么理解不对的地方 请各位指出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值