Абстрактный шаблон проектирования — это шаблон творческого проектирования, который предоставляет интерфейс для создания семейств связанных или зависимых объектов без указания их конкретных классов. Этот шаблон способствует слабой связи между клиентским кодом и создаваемыми им объектами, что делает код более гибким и простым в обслуживании.

Давайте углубимся в практический пример реализации абстрактного шаблона проектирования в TypeScript. Предположим, мы создаем библиотеку пользовательского интерфейса, которая должна поддерживать несколько тем (например, светлую и темную тему). Каждая тема имеет свой набор компонентов пользовательского интерфейса, таких как кнопки и заголовки. Мы хотим создать эти компоненты пользовательского интерфейса таким образом, чтобы мы могли легко переключаться между темами.

Шаг 1. Определите абстрактные классы и методы:

Сначала мы определяем абстрактный класс UIComponent, который представляет общий компонент пользовательского интерфейса. Этот класс объявляет абстрактный метод render, который должны реализовать конкретные компоненты пользовательского интерфейса.

abstract class UIComponent {
 abstract render(): void;
}

Шаг 2. Создайте конкретные классы:

Затем мы создаем конкретные классы компонентов пользовательского интерфейса для каждой темы, такие как LightButton, DarkButton, LightHeader и DarkHeader.

Эти классы наследуют абстрактный класс `UIComponent` и реализуют метод `render` в соответствии со своими темами.

class LightButton extends UIComponent {
render() {
// Render a button with light theme styles
}
}

class DarkButton extends UIComponent {
render(){
// Render a button with dark theme styles
}
}

class LightHeader extends UIComponent {
render() {
// Render a header with light theme styles
}
}

class DarkHeader extends UIComponent {
render(){
// Render a header with dark theme styles
}
}

Шаг 3. Реализация фабричного метода:

Чтобы динамически создавать компоненты пользовательского интерфейса на основе выбранной темы, мы реализуем фабричный метод. Этот метод принимает идентификатор темы в качестве входных данных и возвращает соответствующий экземпляр компонента пользовательского интерфейса.

function createUIComponent(theme: string): UIComponent {
switch (theme) {
case ‘light’:
return new LightButton();
case ‘dark’:
return new DarkButton();
// Handle other components and themes
}
}

Теперь вы можете использовать фабричный метод createUIComponent для создания компонентов пользовательского интерфейса, не зная их конкретных классов:

const button = createUIComponent(‘light’);
button.render(); // Renders a button with light theme styles

Реализуя абстрактный шаблон проектирования, мы получили гибкое и расширяемое решение для создания компонентов пользовательского интерфейса, зависящих от темы. Этот шаблон позволяет нам легко добавлять новые темы и компоненты пользовательского интерфейса, а также отделяет клиентский код от особенностей каждого компонента.