设计模式中的工厂函数和普通构造函数的区别

工厂函数和普通构造函数相比,优势在于它可以动态地创建不同类型的对象,并且不需要使用new关键字来创建对象。工厂函数还可以返回任意类型的对象,包括原始类型、对象、函数等,并且可以使用闭包来实现私有属性和方法。

以下给出具体代码示例:
在下面代码中,使用工厂函数createMonster和一个构造函数Person来创建对象。可以看到区别主要有:

  • 返回值不同:工厂函数返回一个新的对象,而构造函数返回一个已经初始化的对象
  • 对象类型不同:工厂函数可以返回任何类型的对象,原始类型、对象、函数,可以使用闭包来实现私有属性和方法,而构造函数只能返回该构造函数的实例对象
  • 创建方式不同:创建工厂函数时,我们只需要定义一个普通的函数,并在函数内部返回一个新的对象。在创建普通构造函数时,我们需要使用特殊的语法来定义一个构造函数,并使用new关键字来创建一个新的对象。

工厂函数

function createMonster(type) {
    
    
  let monster = {
    
    };
  if (type === 'dragon') {
    
    
    monster = {
    
    
      name: 'Dragon',
      attack: 100,
      defense: 50,
      speed: 80,
      fly: function() {
    
    
        console.log('The dragon is flying.');
      }
    };
  } else if (type === 'goblin') {
    
    
    monster = {
    
    
      name: 'Goblin',
      attack: 30,
      defense: 20,
      speed: 50,
      sneak: function() {
    
    
        console.log('The goblin is sneaking.');
      }
    };
  } else {
    
    
    console.log('Invalid monster type.');
  }
  return monster;
}

const dragon = createMonster('dragon');
console.log(dragon.name); // 输出:Dragon
console.log(dragon.attack); // 输出:100
console.log(dragon.defense); // 输出:50
console.log(dragon.speed); // 输出:80
dragon.fly(); // 输出:The dragon is flying.

const goblin = createMonster('goblin');
console.log(goblin.name); // 输出:Goblin
console.log(goblin.attack); // 输出:30
console.log(goblin.defense); // 输出:20
console.log(goblin.speed); // 输出:50
goblin.sneak(); // 输出:The goblin is sneaking.

new构造函数

function Monster(name, attack, defense, speed) {
    
    
  this.name = name;
  this.attack = attack;
  this.defense = defense;
  this.speed = speed;
}

Monster.prototype.fly = function() {
    
    
  console.log(`${
      
      this.name} is flying.`);
};

Monster.prototype.sneak = function() {
    
    
  console.log(`${
      
      this.name} is sneaking.`);
};

const dragon = new Monster('Dragon', 100, 50, 80);
console.log(dragon.name); // 输出:Dragon
console.log(dragon.attack); // 输出:100
console.log(dragon.defense); // 输出:50
console.log(dragon.speed); // 输出:80
dragon.fly(); // 输出:Dragon is flying.

const goblin = new Monster('Goblin', 30, 20, 50);
console.log(goblin.name); // 输出:Goblin
console.log(goblin.attack); // 输出:30
console.log(goblin.defense); // 输出:20
console.log(goblin.speed); // 输出:50
goblin.sneak(); // 输出:Goblin is sneaking.

现实生活中的工厂和手工制作有很多例子,下面是其中的一些:

汽车制造工厂和手工制作汽车:汽车制造工厂是一种大规模生产汽车的工厂,它使用机器和自动化设备来生产汽车。而手工制作汽车则是一种传统的制造方式,它需要工匠使用手工工具和材料来制作汽车。

食品加工工厂和手工制作食品:食品加工工厂是一种大规模生产食品的工厂,它使用机器和自动化设备来加工食品。而手工制作食品则是一种传统的制造方式,它需要厨师使用手工工具和材料来制作食品。

电子产品制造工厂和手工制作电子产品:电子产品制造工厂是一种大规模生产电子产品的工厂,它使用机器和自动化设备来生产电子产品。而手工制作电子产品则是一种传统的制造方式,它需要技术工人使用手工工具和材料来制作电子产品。

总之,工厂和手工制作都有各自的优缺点,它们在不同的情况下都有它们的用武之地。在前端开发中,工厂函数和普通函数也是如此,它们都有各自的用途和优缺点,需要根据具体情况来选择使用哪种方式。

猜你喜欢

转载自blog.csdn.net/weixin_43811753/article/details/130166446