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?