工厂模式与javascript中的构造函数模式

时间:2016-02-06 11:22:38

标签: javascript design-patterns

我在javascript中看到了一个关于设计模式的教程。虽然教程很好,但我几乎没有问题。

正如我所见,Factory和构造函数产生相同的结果。那么它们之间的区别是什么?每个用例有哪些用例?

工厂模式

function factoryPattern(data) {
  var factory = {};
  factory.name = data.name;
  factory.title = data.title;
  factory.startDate = data.startDate;
  return factory;
}
var factoryUse = factoryPattern(jsonObj);

构造函数模式

function constructorPattern(data) {
  this.name = data.name;
  this.title = data.title;
  this.startDate = data.startDate;
}

var constructorUse = new constructorPattern();

编辑:正如@Michael Warner所解释的那样。 Factory方法返回不可变对象,它们在创建后没有链接到它们的创建者。

但是在构造函数模式中,它们确实与它们有关联。

因此,有一个实际的用例会更好地理解为什么有时候有一个链接到它们的构造函数的对象是好的。

2 个答案:

答案 0 :(得分:7)

工厂创建一个对象并将其返回。就是这样。创建的对象是独立的,关于此的最好的部分是您可以使用该对象而不受其他对象发生的影响。这被称为单身人士。

var Car = function(){
    var car = {};
    car.running = false;
    car.toggleEngine = function(){
        this.running = !this.running;
    }
    return car;
};

car1 = Car(); // running false
car2 = Car(); // running false
car1.toggleEngine(); // running true
car2.toggleEngine = undefined; // to broke down.
car1.toggleEngine(); //running false

构造函数向函数添加代码,因此您可以链接到对象构造函数的原型。关于这个附加链接的好处是使用看起来像这样的功能共享技术。

var Car = function (){
    this.running = false;
};
Car.prototype.toggleEngine = function(){
    this.running = !this.running;
}
var car1 = new Car; //running false
var car2 = new Car; //running false

car2.toggleEngine() //running true
Car.prototype.toggleEngine = function(){};
car1.toggleEngine() //running false

正如我们在创建对象后所看到的那样,它们仍然非常相关。

要清楚,您仍然可以执行以下操作,而不会影响构造函数创建的对象。使用功能共享方法并屏蔽构造函数给出的原型函数。所以没有完全链接,但它们通过构造函数原型链接。

var car1 = new Car; //running false
var car2 = new Car; //running false

car2.toggleEngine() //running true
car2.toggleEngine = function(){};
car1.toggleEngine() //running true

答案 1 :(得分:2)

使用工厂,您可以完全自由地返回对象,因此您可以根据输入数据或一天中的时间选择一个或另一个构造函数,甚至根本不构建任何构造函数 - 使用工厂时返回sigletons。

相反,构造函数基本上实例化一个具有特定原型的对象,您可以在构造函数的主体中对其进行配置。