<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Что такое &quot;фабрика&quot; в программировании? На примере JavaScript]]></title><description><![CDATA[<p dir="auto"><strong>Фабрика (Factory)</strong> — это <strong>паттерн проектирования</strong>, который позволяет создавать объекты без указания конкретного класса или типа. Вместо прямого вызова <code>new SomeClass()</code>, ты используешь <strong>функцию (или объект)</strong>, которая решает, <strong>какой именно объект создать</strong>, в зависимости от входных данных.</p>
<p dir="auto">Преимущества:</p>
<ul>
<li>Упрощает расширение кода.</li>
<li>Скрывает сложность создания объектов.</li>
<li>Централизует логику создания.</li>
</ul>
<hr />
<h3>Пример: Фабрика на JavaScript</h3>
<p dir="auto">Допустим, у нас есть разные типы пользователей: <strong>админ</strong>, <strong>модератор</strong>, <strong>обычный пользователь</strong>. У каждого разные права.</p>
<p dir="auto">Мы можем создать <strong>фабрику</strong>, которая будет возвращать нужный объект в зависимости от роли.</p>
<pre><code class="language-javascript">// Базовый класс пользователя
class User {
    constructor(name, role) {
        this.name = name;
        this.role = role;
    }

    getInfo() {
        return `${this.name} — ${this.role}`;
    }

    hasAccess() {
        return false;
    }
}

// Конкретные типы пользователей
class Admin extends User {
    constructor(name) {
        super(name, 'admin');
    }

    hasAccess() {
        return true; // Админ имеет доступ ко всему
    }

    deleteAccount(userId) {
        console.log(`Админ ${this.name} удалил аккаунт ${userId}`);
    }
}

class Moderator extends User {
    constructor(name) {
        super(name, 'moderator');
    }

    hasAccess() {
        return true;
    }

    banUser(userId) {
        console.log(`Модератор ${this.name} забанил пользователя ${userId}`);
    }
}

class RegularUser extends User {
    constructor(name) {
        super(name, 'user');
    }

    hasAccess() {
        return false;
    }
}

// 🏭 Фабрика пользователей
function createUser(name, role) {
    switch (role) {
        case 'admin':
            return new Admin(name);
        case 'moderator':
            return new Moderator(name);
        case 'user':
            return new RegularUser(name);
        default:
            throw new Error(`Неизвестная роль: ${role}`);
    }
}

// 🔧 Использование фабрики
const admin = createUser("Алексей", "admin");
const mod = createUser("Мария", "moderator");
const user = createUser("Иван", "user");

console.log(admin.getInfo()); // Алексей — admin
console.log(mod.getInfo());   // Мария — moderator
console.log(user.getInfo());  // Иван — user

console.log(admin.hasAccess()); // true
console.log(user.hasAccess());  // false

admin.deleteAccount(123); // Алексей удалил аккаунт 123
mod.banUser(456);         // Мария забанила пользователя 456
</code></pre>
<hr />
<h3><img src="https://forum.exlends.ru/assets/plugins/nodebb-plugin-emoji/emoji/android/1f539.png?v=a1e94250dac" class="not-responsive emoji emoji-android emoji--small_blue_diamond" style="height:23px;width:auto;vertical-align:middle" title="🔹" alt="🔹" /> Почему это удобно?</h3>
<ul>
<li>Если ты захочешь добавить новый тип пользователя (например, <code>guest</code>), тебе нужно только:
<ol>
<li>Создать новый класс.</li>
<li>Добавить его в <code>createUser</code>.</li>
</ol>
</li>
<li>Всё остальное приложение продолжает работать, используя общий интерфейс (<code>hasAccess</code>, <code>getInfo</code> и т.д.).</li>
</ul>
<hr />
<p dir="auto"><strong>Фабрика</strong> — это как “конвейер”, который на вход получает параметры (например, <code>role</code>) и на выходе даёт готовый объект нужного типа.</p>
<p dir="auto">Это делает код:</p>
<ul>
<li>гибче,</li>
<li>легче для тестирования,</li>
<li>проще для расширения.</li>
</ul>
]]></description><link>https://forum.exlends.ru/topic/217/chto-takoe-fabrika-v-programmirovanii-na-primere-javascript</link><generator>RSS for Node</generator><lastBuildDate>Mon, 24 Aug 2026 04:56:26 GMT</lastBuildDate><atom:link href="https://forum.exlends.ru/topic/217.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 26 Aug 2025 08:42:47 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Что такое &quot;фабрика&quot; в программировании? На примере JavaScript on Fri, 05 Sep 2025 19:38:24 GMT]]></title><description><![CDATA[<p dir="auto">Теперь вижу, что фабрика действительно упрощает жизнь, особенно когда классов много. Попробую переделать свой модуль аутентификации по этому принципу.</p>
]]></description><link>https://forum.exlends.ru/post/562</link><guid isPermaLink="true">https://forum.exlends.ru/post/562</guid><dc:creator><![CDATA[Алекс44]]></dc:creator><pubDate>Fri, 05 Sep 2025 19:38:24 GMT</pubDate></item><item><title><![CDATA[Reply to Что такое &quot;фабрика&quot; в программировании? На примере JavaScript on Fri, 05 Sep 2025 19:36:37 GMT]]></title><description><![CDATA[<p dir="auto">Достаточно тестировать, что фабрика возвращает корректный тип объекта для разных входных параметров. А методы самих классов тестируются отдельно.</p>
]]></description><link>https://forum.exlends.ru/post/561</link><guid isPermaLink="true">https://forum.exlends.ru/post/561</guid><dc:creator><![CDATA[Wowk]]></dc:creator><pubDate>Fri, 05 Sep 2025 19:36:37 GMT</pubDate></item><item><title><![CDATA[Reply to Что такое &quot;фабрика&quot; в программировании? На примере JavaScript on Fri, 05 Sep 2025 19:36:31 GMT]]></title><description><![CDATA[<p dir="auto">А я не могу понять, а как тестировать такие фабрики? Мокировать же все классы при unit-тестах? Будет результат? Что скажете?</p>
]]></description><link>https://forum.exlends.ru/post/560</link><guid isPermaLink="true">https://forum.exlends.ru/post/560</guid><dc:creator><![CDATA[Василий]]></dc:creator><pubDate>Fri, 05 Sep 2025 19:36:31 GMT</pubDate></item><item><title><![CDATA[Reply to Что такое &quot;фабрика&quot; в программировании? На примере JavaScript on Fri, 05 Sep 2025 19:36:28 GMT]]></title><description><![CDATA[<p dir="auto">Если использовать маппинг через объект и не нарушает. Добавляешь новый класс и регистрируешь его в маппинге без изменения кода фабрики. Или можно вообще использовать внедрение зависимостей.</p>
]]></description><link>https://forum.exlends.ru/post/559</link><guid isPermaLink="true">https://forum.exlends.ru/post/559</guid><dc:creator><![CDATA[Ванек]]></dc:creator><pubDate>Fri, 05 Sep 2025 19:36:28 GMT</pubDate></item><item><title><![CDATA[Reply to Что такое &quot;фабрика&quot; в программировании? На примере JavaScript on Fri, 05 Sep 2025 19:36:21 GMT]]></title><description><![CDATA[<p dir="auto">Не нарушает ли фабрика принципы SOLID? Вроде как должна быть открытость для расширения, но закрытость для изменений.</p>
]]></description><link>https://forum.exlends.ru/post/558</link><guid isPermaLink="true">https://forum.exlends.ru/post/558</guid><dc:creator><![CDATA[Алекс44]]></dc:creator><pubDate>Fri, 05 Sep 2025 19:36:21 GMT</pubDate></item><item><title><![CDATA[Reply to Что такое &quot;фабрика&quot; в программировании? На примере JavaScript on Fri, 05 Sep 2025 19:34:33 GMT]]></title><description><![CDATA[<p dir="auto">фабрика как раз для того и нужна, чтобы инкапсулировать сложную логику создания. Можно передавать объект с опциями: createUser({ name: ‘Alex’, role: ‘admin’, accessLevel: 3 }).</p>
]]></description><link>https://forum.exlends.ru/post/557</link><guid isPermaLink="true">https://forum.exlends.ru/post/557</guid><dc:creator><![CDATA[Wowk]]></dc:creator><pubDate>Fri, 05 Sep 2025 19:34:33 GMT</pubDate></item><item><title><![CDATA[Reply to Что такое &quot;фабрика&quot; в программировании? На примере JavaScript on Fri, 05 Sep 2025 19:34:31 GMT]]></title><description><![CDATA[<p dir="auto">А как быть с зависимостями? Допустим, для создания Admin нужен дополнительный параметр — уровень доступа. Не усложнит ли это фабрику?</p>
]]></description><link>https://forum.exlends.ru/post/556</link><guid isPermaLink="true">https://forum.exlends.ru/post/556</guid><dc:creator><![CDATA[Василий]]></dc:creator><pubDate>Fri, 05 Sep 2025 19:34:31 GMT</pubDate></item><item><title><![CDATA[Reply to Что такое &quot;фабрика&quot; в программировании? На примере JavaScript on Fri, 05 Sep 2025 19:34:27 GMT]]></title><description><![CDATA[<p dir="auto">Думаю, что можно заменить switch на объект-маппинг: const roles = { admin: Admin, moderator: Moderator } и потом вызывать new roles<a href="name">role</a>. Так добавление новой роли будет в одну строку.</p>
]]></description><link>https://forum.exlends.ru/post/555</link><guid isPermaLink="true">https://forum.exlends.ru/post/555</guid><dc:creator><![CDATA[Ванек]]></dc:creator><pubDate>Fri, 05 Sep 2025 19:34:27 GMT</pubDate></item><item><title><![CDATA[Reply to Что такое &quot;фабрика&quot; в программировании? На примере JavaScript on Fri, 05 Sep 2025 19:34:20 GMT]]></title><description><![CDATA[<p dir="auto">А если нужно добавить новую роль, например, ‘editor’, не придется ли переписывать всю фабрику? Мне кажется, switch-конструкция не очень масштабируема.</p>
]]></description><link>https://forum.exlends.ru/post/554</link><guid isPermaLink="true">https://forum.exlends.ru/post/554</guid><dc:creator><![CDATA[Алекс44]]></dc:creator><pubDate>Fri, 05 Sep 2025 19:34:20 GMT</pubDate></item></channel></rss>