Padrão de design --- padrão FlyWeight

1. Introdução

Na programação, às vezes nos deparamos com o cenário de criação de um grande número de instâncias de objetos iguais ou semelhantes, como as peças pretas e brancas do jogo Go, e as carteiras e cadeiras da sala de aula. Se locais semelhantes forem abstraídos e compartilhados, isso pode economizar muitos recursos do sistema e melhorar o desempenho do sistema, o que corresponde ao modo Flyweight.

2 Definições

Padrão Flyweight: Use técnicas de compartilhamento para oferecer suporte eficiente à reutilização de um grande número de objetos refinados. Ele reduz bastante o número de objetos que precisam ser criados pelo compartilhamento de objetos existentes e evita a sobrecarga de um grande número de classes semelhantes, melhorando assim a utilização dos recursos do sistema.

3 Estado interno e estado externo

O estado interno refere-se às informações compartilhadas no Flyweight, como cadeiras de sala de aula, cujo material, forma, especificação e estrutura são todos iguais e podem ser totalmente compartilhados.

O estado externo refere-se a informações que o Flyweight não pode compartilhar, e essas informações mudarão conforme o ambiente muda, como o usuário atual das mesas e cadeiras da sala de aula.

4 Estrutura e Implementação

O modo Flyweight contém 4 funções importantes, a saber:

1. A função abstrata FlyWeight é a classe base de todas as classes específicas Flyweight, e é a interface pública que as especificações Flyweight específicas precisam implementar.Estados externos não Flyweight são passados ​​através de métodos na forma de parâmetros.

2. Função Flyweight concreto: Implemente a interface especificada na função Flyweight abstrata.

3. Função Flyweight não compartilhável: É um estado externo que não pode ser compartilhado, sendo injetado nos métodos relevantes de Flyweight específico na forma de parâmetros.

4. Função Flyweight Factory: responsável por criar e gerenciar funções Flyweight. Quando um objeto cliente solicita um objeto flyweight, a fábrica flyweight verifica se existe um objeto flyweight que atende aos requisitos do sistema e, caso exista, é fornecido ao cliente; caso não exista, um novo objeto flyweight é criado.

A estrutura é mostrada na figura a seguir (a figura é da referência 2):

5 vantagens e desvantagens

A principal vantagem do padrão Flyweight é que apenas uma cópia do mesmo objeto é salva, o que reduz o número de objetos no sistema, reduzindo assim a pressão na memória causada por objetos refinados no sistema.

Suas principais desvantagens são:

1. Para tornar os objetos compartilháveis, alguns estados que não podem ser compartilhados precisam ser externalizados, o que aumentará a complexidade do programa.

2. Ler o estado externo do Flyweight tornará o tempo de execução um pouco mais longo.

6 Exemplos de Código

Para o mesmo site, não precisamos criar objetos de instância diferentes, apenas usar usuários diferentes e usuários diferentes para a mesma instância.

6.1 Definir Usuário Usuário

/**
 * @program: design-pattern-learning
 * @author: zgr
 * @create: 2021-10-22 15:23
 **/
@Data
@AllArgsConstructor
public class User {
    /**
     * 用户名
     */
    private String name;

    /**
     * 简介
     */
    private String desc;

}

6.2 Site Resumo Flyweight

**
 * @program: design-pattern-learning
 * @author: zgr
 * @create: 2021-10-22 11:28
 * @desc: 抽象享元接口
 **/
public interface Website {

    /**
     * 发布博客
     * @param user 用户
     */
    void postBlog(User user);


    /**
     * 上传图片
     * @param user 用户
     */
    void uploadPicture(User user);
}

6.3 Site do Concrete Flyweight Concrete

/**
 * @program: design-pattern-learning
 * @author: zgr
 * @create: 2021-10-22 15:22
 **/
public class ConcreteWebsite implements Website{

    @Override
    public void postBlog(User user) {
        System.out.println(MessageFormat.format("{0}用户,简介是{1},上传博客", user.getName(), user.getDesc()));
    }

    @Override
    public void uploadPicture(User user) {
        System.out.println(MessageFormat.format("{0}用户,简介是{1},上传图片", user.getName(), user.getDesc()));
    }
}

6.4 Fábrica

/**
 * @program: design-pattern-learning
 * @author: zgr
 * @create: 2021-10-22 15:28
 **/
public class Factory {
    private Map<String, Website> websites = new HashMap<>();


    public  Website getWebsite(String key){
        if (websites.containsKey(key)){
            return websites.get(key);
        }
        Website website = new ConcreteWebsite();
        websites.put(key, website);
        return website;
    }
}

6.5 Programa principal

/**
 * @program: design-pattern-learning
 * @author: zgr
 * @create: 2021-10-22 11:27
 **/
public class MainClass {
    public static void main(String[] args) {
        Factory factory = new Factory();
        Website website11 = factory.getWebsite("csdn");
        Website website12 = factory.getWebsite("csdn");
        Website website21 = factory.getWebsite("zhihu");
        Website website22 = factory.getWebsite("zhihu");

        website11.postBlog(new User("张三", "助理工程师"));
        website11.uploadPicture(new User("张三", "助理工程师"));
        website12.postBlog(new User("李四", "中级工程师"));
        website12.uploadPicture(new User("李四", "中级工程师"));

        website21.postBlog(new User("王五", "副高级工程师"));
        website21.uploadPicture(new User("王五", "副高级工程师"));
        website22.postBlog(new User("赵六", "高级工程师"));
        website22.uploadPicture(new User("赵六", "高级工程师"));
    }
}

6.6 Resultados corridos

7 Cotações 

1 "Padrões de Design Dahua"

Modo Flyweight (versão detalhada)

8 Código fonte

https://github.com/airhonor/design-pattern-learning/tree/main/src/com/hz/design/pattern/flyweight

 

Acho que você gosta

Origin blog.csdn.net/honor_zhang/article/details/120901850
Recomendado
Clasificación