构造器模式的工厂模式等效

时间:2018-09-18 23:12:08

标签: javascript design-patterns constructor factory-pattern

我正在使用构造函数模式来创建我的对象,如下所示;

// Traditional constructor function
const Car = function( color, speed, oil )
{
    this.color = color;
    this.config = { speed: speed, oil: oil };
    // ...
}

Car.prototype.internal = function()
{
    console.log( "internal" );
    // ...
}

Car.prototype.gas = function()
{
    this.internal();
    console.log( this.color );
    // ...
}

Car.prototype.brake = function()
{
    console.log( this.config );
    // ...
}

我想将我的设计更改为与该设计等效但具有工厂功能的设计。所以我写了下面的代码;

// Factory Design with Delegation
const carProto = ( function()
{
    const carPrototype = {};
    // Private function
    function internal()
    {
        console.log( "internal" );
        // ...
    }

    // Public function
    carPrototype.gas = function()
    {
        internal();
        console.log( this.color );
        // ...
    }

    carPrototype.brake = function()
    {
        console.log( this.config );
        // ...
    }

    return carPrototype;
} )();

function carFactory( color, speed, oil ) 
{
    return Object.assign( Object.create( carProto ), 
    { 
        color: color,
        config: { speed: speed, oil: oil } 
    } );
}

最后,我按如下方式创建对象;

var mazdaF = carFactory( "red", 10, 130 );
var mazdaT = new Car( "yellow", 20, 120 );

我想知道这是否正确。如果事实并非如此,那么有人可以帮助我实现最佳方法吗?

1 个答案:

答案 0 :(得分:0)

这对我来说似乎很好。它与我使用的语法不同。行为上的主要区别是您的工厂允许我查看内部范围。我可以使用mazdaF.colormazdaF.config来访问颜色和配置。如果您希望它以这种方式工作,那很好。但是,如果您希望内部作用域对对象是私有的,则可以使用不同的语法。

这是另一种方式(我不确定这是通用的标准做法,所以我希望其他人会鸣叫……):

const carFactory2=(c,s,o)=>{
    const color=c;
    const config={'speed':s, 'oil':o};
    const internal=()=>{
        console.log('internal');
    }
    return{
        gas: ()=>{
            internal();
            return color;
        },
        brake: ()=>{
            internal();
        }
    }
}

var mazdaF = carFactory2( "red", 10, 130 );

这种方法实际上使对象保留了函数的内部范围。 colorconfiginternal()在函数外部无法访问,因此,除非您为其添加方法,否则无法在下游进行更改。在这里,mazdaF.gas()将返回颜色并执行内部方法。 ...但是config不能通过用mazdaF.brake()调用mazdaF.config = ... OR 蛮力来更改。

我希望我不会引起混乱。同样,我认为您的选择将取决于您希望如何使用内部范围。