JavaScript设计模式(二)-- 工厂方法模式

定义

通过对产品类的抽象使其创建业务主要负责用于多类产品的实例。

这是一个什么样的模式?

创建多个学科类,如果使用简单工厂模式进行:

//创建Java part
var Java = function (content){
    //.....
}

//创建 PHP part
var Php = function (content){
    //......
}
//创建 JavaScript part
var JavaScript = function (content){
    this. content = content;(function (content){
        var div = document. createElement( 'div') ;
        div. innerHTML = content;
        div. style. background = 'pink' ;
        document . getElementById('container').appendChild(div);
     })(content);
    }
// 学科工厂
function JobFactory (type, content){
    switch (type){
        case 'java' :
            return new Java (content) ;
        case ' php ':
            return new Php (content) ;
        case ' JavaScript' :
            return new JavaScript (content) ;
    }
}

每多一个 part, 就要再次重复这个工作,比较麻烦。

工厂方法的本意是说将实际创建对象工作推迟到子类中。这样核心类就成了抽象类,不过在Javascript中,没有像传统创建抽象类那样的方式轻易创建抽象类。可以将工厂方法看作是一个实例化对象的工厂类。使用安全模式类

安全模式类

屏蔽对类使用造成的错误。比如对于Demo类的创建,创建类是需要new关键字的,但是如果其他人不知道这是一个类,会忽略new关键字,直接执行类。

var Demo = function(){};
Demo.prototype = {
    show:function(){
        console.log('Get!!!');
    }
}
var d = new Demo();
d.show();
var d = Demo();
d.show();

为了避免这种错误的发生,在构造函数开始前先判断当前对象this指代是不是类(Demo),如果是就通过new关键字创建对象,如果不是说明类在全局作用域中执行。

方法改进

//安全模式创建的工厂类
var Factory = function(type, content) {
    if (this instanceof Factory) {
        var s = new this [type] (content);
        return s;
    }else{
        return new Factory (type, content);
    }
}

//工厂原型中设置创建所有类型数据对象的基类
Factory .prototype = {
    Java : function (content){
        //......
    },
    JavaScript : function (content) {
        //.......   
    },
    UI : function (content) {
        this. content = content;
        (function (content){
            var div = document . createElement ( 'div');
            div. innerHTML = content;
            div.style.border = '1px solid red';
            document. getElementById('container').appendChild(div) ;
        }) (content);
    },
    php : function (content) {
        //.......
    }
};

如果需要添加类,只需要在Factory这个工厂类的原型中进行编写。

总结

对于创建多类对象,简单工厂模式是不行的。通过工厂方法模式,可以轻松创建多个类的实例对象,同时也避免了使用者与对象类之间的耦合,用户不必关系创建对象的具体类,只需要调用工厂方法就行。

如果我需要的产品很多的话,需要创建非常多的工厂,所以这种方式的缺点也很明显;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值