Modo singleton
Às vezes, a motivação é importante ter apenas uma instância da classe. Por exemplo, um sistema deve ter apenas uma instância de gerenciamento de janelas.
O padrão de singleton é o padrão de design mais simples: a classe é responsável por se instanciar, garantindo que haja apenas uma instância e fornecendo uma entrada para acessar esta instância.
Propósito
1. Verifique se apenas uma instância foi criada.
2. Forneça uma entrada para acessar esta instância.
Use final para garantir que seja criado uma vez e o construtor privado garante que não seja instanciado. O método GetInstance de público garante que o acesso externo seja possível. A seguir, o modo faminto:
classe pública Singleton {private Static final Singleton Instância = new Singleton (); private singleton () {} public static singleton getInstance () {retorna instância; }}
Modo preguiçoso:
classe pública SingleTondemo {private estático volátil singleTondemo instância = null; private singleTondemo () {} public static singleTondemo getInstance () {if (instance == null) {synchronized (singleTondemo .class) {if (instance == null) {instance = new singleTondemo (); }} retornar a instância; }}
Cenários e exemplos aplicáveis
1. A classe de logger impede a criação de uma instância de logger toda vez que o log é impresso.
2. Classe de controle, geralmente há apenas uma instância de controle em todo o sistema.
Questões e implementações específicas
1. O modo singleton robusto e seguro para roscas deve ser seguro.
2. O modo preguiçoso usa um mecanismo de bloqueio duplo.
3. O modo Eagle usa variáveis estáticas e é instanciado quando o programa é carregado, garantindo que haja apenas uma instância.
4. Os métodos abstratos de fábrica e fábrica são geralmente projetados como padrões de singleton para garantir que haja apenas uma fábrica.
5. Ao usar a serialização e a desserialização, várias instâncias serão criadas. Use a função ReadResolve para evitar isso, mas é melhor não usar a serialização.
classe pública Singleton implementa serializável {... // Este método é chamado imediatamente depois que um objeto dessa classe é desserializado. // Este método retorna a instância de Singleton. objeto protegido readResolve () {return getInstance (); }}
Pontos -chave
1. Em programas com vários threads, preste atenção à sincronização de dados.
2. Ao serializar, use o método ReadResolve para retornar a instância para evitar vários objetos que estão sendo criados.
3. Se carregado por vários carregadores de classe, várias instâncias serão criadas.
Modo de fábrica simples
O simples modelo de motivação da fábrica é a base e a implementação preliminar de métodos abstratos de fábrica e fábrica.
Propósito
1. Não divulgue os detalhes da instanciação do objeto ao cliente.
2. Crie um objeto através de uma interface comum.
concluir
A implementação é muito simples:
1. Quando um cliente precisa de produto, ele não usa o novo para criá -lo, mas fornece uma descrição do produto à fábrica, permitindo que a fábrica forneça um novo produto.
2. A fábrica instancia um produto para o cliente.
3. O cliente usa produto abstrato, sem se importar com a implementação concreta do produto.
Exemplo
1. Programa de desenho para formas de desenho. A forma é a interface do produto e os triângulos são o produto de concreto. Podemos criar uma fábrica e, em seguida, criar o produto de acordo com a descrição do cliente. No entanto, ao adicionar novas formas, precisamos modificar a classe de fábrica.
Questões e implementações específicas
1. Ao adicionar novos produtos, a fábrica precisa ser modificada.
public class ProductFactory {public Product CreateProduct (String productId) {if (id == id1) retorna new OneProduct (); if (id == id2) retorna new OtherProduct (); ... // assim por diante para os outros IDs retornam nulo; // Se o ID não tiver nenhum dos valores esperados} ...}Geralmente, usamos a instrução IF para julgar a descrição do produto e instanciar diferentes produtos. Quando existem novos produtos, precisamos adicionar novos julgamentos. Esse problema pode ser resolvido por padrões abstratos de fábrica.
Resumir
1. Use -o somente quando você realmente precisar de modo de fábrica, caso contrário, ele aumentará a complexidade do programa. Por exemplo, quando vários objetos têm tipos básicos semelhantes, você pode usar o modo simples de fábrica para criar objetos de maneira uniforme.
2. As fábricas simples têm mais declarações de ramo de julgamento, que violam o princípio de abertura e fechamento de modificações. Portanto, é aconselhável usar o modo simples de fábrica para alguns programas fixos e simples e usar o modo de fábrica abstrato ou o modo de método de fábrica para alguns programas complexos e frequentemente expandidos.