JS设计模式:对象创建模式

因此,哈布罗夫斯克公民已经在OTUS的这个星期四开始了“ Fullstack JavaScript Developer”课程。 今天,我们将与您分享另一位作者的出版物,以期课程开始。



文章作者: Pavel Yakupov


在本文中,我们将讨论Java语言中最简单,最常见的设计模式-并尝试解释何时应用哪种模式。
一般而言, 设计模式是什么? 设计模式是一个术语,用于表示创建程序时常见问题的常用解决方案。

简而言之,设计模式是经常使用的成功解决方案。 设计模式作为一个概念是在没有提到JavaScript编程语言的时候形成的,在软件工程领域,1994年由四大巨头详细描述了设计模式。 但是,在我们的文章中,我们将转向使用JavaScript编程语言实现一些简单的模式。

让我们快速浏览一下设计模式的主要类型:

创作设计模式


顾名思义,这些模式主要用于创建新对象。 这些包括诸如构造器,工厂,原型和单例的模式。

结构设计模式


这些模式与对象的类和组成相关。 它们有助于构造或重组对象或其零件,而不会影响整个系统的运行。

行为设计模式


这种类型的设计模式旨在改善不同对象之间的通信。 行为设计模式包括Commander,Iterator,Mediator,Observer,状态模式,策略和模板。

在本文中,我们仅分析与创建对象相关的设计模式-因为它们更简单并且更适合初学者开始创建待办事项应用程序,控制台中的文本RPG,Canvas上的简单游戏等。

模式“模块”


这种设计模式以JavaScript语言出现,可以说是不由自主的。 最初,该语言并未考虑消除诸如污染全球范围之类的现象(并且在其他语言中,例如C#或C ++,存在可以解决此问题的命名空间)。 另外,模块对于代码重用来说是部分必需的,因为在首次创建和使用模块之后,可以更有效地将它们连接到其他团队的项目。
模块模块在其存在的整个过程中(已在ES5中被广泛使用)使用了IIFE(即功能表达式)。

这是“模块”模式的一个简单示例:

const first_Module = (function() { let Surname = "Ivanov"; let Nickname = "isakura313"; function declare_Surname() { console.log(Surname); } return { declare_Nickname: function() { alert(Nickname); } } })(); first_Module.declare_Nickname(); console.log(Surname); //       

“模块”模式完全封装了其中包含的数据。 我们只能使用公共方法来访问它们,直到必须以这种方式实现“现成的”公共和私有方法的JavaScript实现。

构造器模式


这是设计用于创建对象的设计模式。 构造函数是一个创建新对象的函数。 但是,在JavaScript中,即使没有构造函数或类定义,也可以即时创建对象。
构造函数是最常用的设计模式之一。 它用于创建某种类型的对象。

 //     to-do  //,    ,           class ItemDeal { constructor(name, color) { this.name = name; this.color = color; } } //     ,       localStorage  ? let item = new ItemDeal(`${text}`, `${select.value - 1}`); // text -   , a select.value -    let myJson = JSON.stringify(item); //        //localStorage,        //localStorage.setItem(item.name, myJson); 

工厂模式


Factory模式是另一种专注于从类创建对象的模式。 在其中,我们提供了委托子类对象创建的公共接口。

这种设计模式最常用于操纵具有不同和相同特征的对象的集合。
在下面的示例中,我们将为文本搜索创建一个敌人类(EnemyFactory)。 是的,示例非常简单,但这是设计模式的问题:“大型”应用程序需要它们。 如果单击该页面仅能弹出三张图片,则没有任何设计模式对您特别有用。

好的,只需在控制台中显示文本RPG的一段代码即可:

 class EnemyFactory{ constructor() { this.createEnemy = function(type) { let enemy; if (type === 'goblin' || type === 'ork') enemy = new Infantry(); else if (type === 'elf') enemy = new Archer(); enemy.attack = function() { return `The ${this._type} is attack`; }; return enemy; }; } } class Infantry { constructor() { this._type = 'goblin'; this.scream = function() { return 'AAAAAAAAA! Za ordu!!!'; }; } } class Archer { constructor() { this._type = 'elf'; this.magic_attack = function() { return 'Magic fog around you! You cant see!!'; }; } } const enemy_army = new EnemyFactory(); let newGoblin = enemy_army.createEnemy('goblin'); let newElf = enemy_army.createEnemy('elf'); console.log(newGoblin.attack()); console.log(newElf.attack()); console.log(newGoblin.scream()); console.log(newElf.magic_attack()); //  

原型模式


在这里,我们使用某种类型的真实对象的“骨架”来创建新对象。 原型是使用JavaScript构建OOP的最原始类型。

 //,     to-do  const itemDeal = { colorOfHeader: blue; //     .    ? create() { console.log("our item create"); //  item }, delete() { console.log("our item delete now"); //   item }, }; //     ,  to-do  //  ,   Trello. const newDeal = Object.create(itemDeal, { owner: { value: 'Paul' } }); console.log(newDeal.__proto__ === itemDeal); //true 

如果您的应用程序可以某种方式扩展或减少功能,则原型模式很有用。

贷款人模式


或者,众所周知,他是“ Singleton”。 “独来独往”是一种特殊的模式,其中只能存在一个类的实例。 该模式的工作方式如下-如果没有创建或返回单个实例,则对象的初始化将起作用。 如果存在,则将返回触发的对象。
假设我们创建一个主要角色的类,并且我们希望它是1,而不是Jumanji中的4。

 class Hero { constructor(name) { if (Hero.exists) { return Hero.instance; } this._name = name; Hero.instance = this; Hero.exists = true; return this; } getName() { return this._name; } setName(name) { this._name = name; } } //    const smolder = new Hero('Smolder!'); console.log(smolder.getName()); // Smolder! const ruby = new Hero('Ruby'); console.log(ruby.getName()); // Smolder! // ,       .         . //            

因此,感谢大家的关注! 我希望这篇文章将成为JavaScript OOP的一个良好的开端(尽管,老实说,我的同事在Java和JavaScript方面具有多年的经验,但OOP并不是很成熟)。 但是,在新标准中,该语言已得到显着改进,并且我相信这种方法只会更频繁地使用(否则Dart将取代所有方法)。

有用的链接:

developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/create
Learn.javascript.ru/class
developer.mozilla.org/en/docs/Web/JavaScript/Introduction_to_Object-Oriented_JavaScript

Source: https://habr.com/ru/post/zh-CN468723/


All Articles