构造函数模式的工厂模式等价物

问题描述 投票:1回答:1

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

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

我想知道这是否正确。如果不是这样,有人可以用最好的方式帮助我实现吗?

javascript design-patterns constructor factory-pattern
1个回答
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 = ...或暴力来改变。

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

© www.soinside.com 2019 - 2024. All rights reserved.