Como usar o Prototype?

Os padrões de design são um pré-requisito para a leitura do código-fonte.

Prototype descreve um cenário para geração de instâncias: geração de instâncias por cópia.

Demonstração Específica

https://mp.weixin.qq.com/s/cnRXW5-rA195sCkgiaWsnw

Função 1: o cliente
pode ser considerado responsável por ligar

public class Manager {
    private HashMap<String,Product> showCase = new HashMap<>();
    public void register(String name,Product product){
        showCase.put(name,product);
    }

    public Product createProduct(String name){
        Product product = showCase.get(name);
        Product clone = product.createClone();
        return clone;
    }
}

 

Função 2:

A função de protótipo é responsável por definir métodos. Qual método é para copiar uma instância existente e gerar uma nova instância

Embora Cloneable seja uma interface marcada, ela deve ser implementada. Caso contrário, ele relatará um erro

public interface Product extends Cloneable {

    public abstract void use();

    public abstract Product createClone();
}

 

Papel 3: A classe de realização concreta do protótipo

public class Spark implements Product {
    @Override
    public void use() {
        System.out.println("我是会发光的 Spark");
    }

    @Override
    public Product createClone() {
        try {
            return (Product) clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return null;
    }
}

Para nos aproximarmos do cenário de uso real, aqui assumimos que existem 2 subcategorias

public class Slash implements Product {
    @Override
    public void use() {
        System.out.println("我是不一样的光 Slash  ");
    }

    @Override
    public Product createClone() {
        Product clone;
        try {
            clone = (Product) clone();
            return clone;
        } catch (CloneNotSupportedException ex) {
            ex.printStackTrace();

        }
        return null;
    }
}

verificação. Gerar uma instância não é o objetivo final, mas basicamente para uso

public static void main(String[] args) {
        Manager manager = new Manager();

        Slash slash = new Slash();
        manager.register("slash", slash);
        Spark spark = new Spark();
        manager.register("spark",spark);

        Product slash = manager.createProduct("slash");
        slash.use();
        Product spark1 = manager.createProduct("spark");
        spark1.use();

    }

 

Por que usar este modo?

 

Razão 1: quando a geração da classe é muito complicada, é muito trabalhoso gerar uma instância, e é necessário usá-la em outros cenários, você pode considerar

Razão 2: dissociar a estrutura e a instância gerada

Se o framework não depende de uma classe específica, você não pode especificar o nome da classe para gerar uma instância, você deve registrar um protótipo com antecedência e, em seguida, copiar para gerar uma nova instância

 

Otimize a demonstração com o método de modelo

Você descobriu que, no caso acima, a implementação de createClone na subclasse está duplicada? O que devo fazer?

 

 

Acho que você gosta

Origin blog.csdn.net/weixin_39394909/article/details/107170714
Recomendado
Clasificación