Шаблон легковеса – это шаблон проектирования в разработке программного обеспечения, целью которого является сокращение использования памяти и повышение производительности приложения за счет обмена максимально возможным объемом данных между несколькими объектами. Этот шаблон особенно полезен при работе с большим количеством объектов со схожими характеристиками, где индивидуальное состояние каждого объекта может быть внешним (можно использовать совместно) или внутренним (нельзя совместно использовать).

Преимущества шаблона наилегчайшего веса:

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

2. Повышение производительности. Совместное использование данных сокращает время и вычислительную мощность, необходимые для создания объектов и управления ими, что приводит к повышению производительности.

3. Сокращение количества объектов: шаблон позволяет вам представлять большое количество объектов, используя меньшее количество общих экземпляров, что приводит к уменьшению количества объектов и связанных с ними накладных расходов.

4. Упрощение кода: шаблон разделяет внутреннее и внешнее состояние, что может привести к более чистому и удобному в сопровождении коду.

5. Гибкость: шаблон Flyweight можно комбинировать с другими шаблонами проектирования для улучшения общей структуры и функциональности приложения.

Сценарии использования шаблона легковеса.

1. Текстовые редакторы. В приложении текстового редактора каждый символ в документе может быть представлен как легковесный объект. Визуальное представление, шрифт и размер персонажа могут быть общими для нескольких экземпляров персонажа.

2. Разработка игры: в игре легковесные объекты могут использоваться для представления частиц, пуль или других мелких графических элементов, которые повторяются много раз.

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

4. Подключения к базе данных: при управлении подключениями к базе данных можно использовать шаблон легковеса для повторного использования подключений с теми же учетными данными.

Представьте, что вы создаете платформу для социальных сетей, где пользователи могут прокручивать свою ленту сообщений, содержащую различные сообщения от их друзей. Каждое сообщение состоит из текстового сообщения, изображения и имени пользователя, разместившего его. Чтобы оптимизировать использование памяти и повысить производительность, вы можете применить шаблон Flyweight.

import java.util.HashMap;
import java.util.Map;

// Flyweight interface
interface Post {
    void display();
}

// Concrete flyweight class
class SharedPost implements Post {
    private String username;
    private String text;
    private String imageUrl;

    public SharedPost(String username, String text, String imageUrl) {
        this.username = username;
        this.text = text;
        this.imageUrl = imageUrl;
    }

    public void display() {
        System.out.println("Username: " + username);
        System.out.println("Text: " + text);
        System.out.println("Image URL: " + imageUrl);
        System.out.println("Displaying post...");
    }
}

// Flyweight factory
class PostFactory {
    private static final Map<String, Post> postMap = new HashMap<>();

    public static Post getPost(String username, String text, String imageUrl) {
        String key = username + "_" + text + "_" + imageUrl;
        Post post = postMap.get(key);

        if (post == null) {
            post = new SharedPost(username, text, imageUrl);
            postMap.put(key, post);
        }

        return post;
    }
}

// Client code
public class SocialMediaExample {
    public static void main(String[] args) {
        String[] usernames = {"user1", "user2", "user3"};
        String[] postTexts = {"Hello, world!", "Having a great day!", "Check out this amazing view!"};
        String[] imageUrls = {"image1.jpg", "image2.jpg", "image3.jpg"};

        for (int i = 0; i < 10; i++) {
            String username = usernames[i];
            String text = postTexts[i];
            String imageUrl = imageUrls[i];

            Post post = PostFactory.getPost(username, text, imageUrl);
            post.display();
            System.out.println("--------");
        }
    }
}

В заключение шаблон Flyweight оптимизирует память и производительность за счет обмена данными между похожими объектами. Это уменьшает избыточность, повышает эффективность и полезно для сценариев со многими экземплярами общих атрибутов.