Definição: Verifique se uma classe possui apenas uma instância e a instancia e fornece esta instância a todo o sistema.
Tipo: Criar diagrama de classe de padrões de classe:
Pontos de conhecimento do diagrama de aula:
1. Os diagramas de classe são divididos em três partes, nome, atributos e métodos.
2. Comentário informações começando com << e terminando com >>
3. Modificador + representa público, - representa privado, # representa protegido, nada representa o pacote visível.
4. Atributos ou métodos sublinhados representam estática.
5. Amigos que não estão familiarizados com o relacionamento entre objetos no diagrama de classe podem se referir ao artigo: o relacionamento entre as classes no padrão de design.
O modo Singleton deve ser o modo mais simples entre os 23 modos de design. Tem os seguintes elementos:
Vamos dar uma olhada em um exemplo simples:
pacote com.wolf.action; importar java.util.hashmap; importar java.util.map; public class de demonstração {public static void main (string args []) lança instantaçãoException, ilegalaccesceptException, classNotfoundException {System.out.println (son.getinScensce (). System.out.println ("Quem sou eu"); }} Classe filho estende o pai {private string name = "filho"; Final String Class = "Demo"; String protegida getName () {return this.query ("aaa"); } Public Static Son getInstance () lança instantion -cception, ilegalaccescessception, classNotFoundException {// Este deve ser um caminho global, caso contrário, retorne (SON) Instância ("com.wolf.action.son"); }} classe pai {mapa estático privado <string, object> instance = new hashmap <string, object> (); Nome de String Private = "Classe Premium"; Protected void fatcher () {System.out.println ("Eu sou a classe pai"); } String protegida Query (string sql) {return sql + "foi feito"; } Public Static Object Instância (string objName) lança instantaçãoException, ilegalAccescessception, ClassNotFoundException {if (Instance.get.get (objName) == null ||! (Instância.get.get (objName) Instância do pai) {instance.put (objName, classe.forname (objName). } retornar a instância.get (objName); }} O padrão de singleton é dividido em dois tipos de acordo com o momento de instantar o objeto: um é o singleton faminto e o outro é o singleton preguiçoso. Quando a classe Singleton é carregada, o Singleton instancia um objeto para sua própria referência; O estilo preguiçoso instanciará o objeto somente quando o método da instância for chamado. O código é o seguinte:
Caso único de estilo de homem faminto
classe pública singleton {private static singleton singleton = new singleton (); private singleton () {} public static singleton getInstance () {return singleton; }}Caso único preguiçoso
classe pública Singleton {private Static Singleton Singleton; private singleton () {} public static sincronizado singleton getInstance () {if (singleton == null) {singleton = new singleton (); } retornar singleton; }}Vantagens do modo Singleton:
Cenários aplicáveis: devido às vantagens acima do modo Singleton, é um modo de design que é mais comumente usado na programação. Resumi o que sei dos cenários adequados para usar o modo Singleton:
Notas no modo Singleton:
Alguma controvérsia sobre o padrão de singleton em Java:
Se um objeto no modo singleton não for usado por um longo tempo, ele será coletado pelo coletor de lixo da JVM? Vi muitas informações dizendo: se um objeto Singleton não for usado na memória por um longo tempo, ele será considerado um lixo pela JVM e será limpo ao realizar a coleta de lixo. Estou cético sobre esta afirmação. Minha própria visão é: no ponto de acesso Virtual Machine versão 1.6, o JVM Garbage Collector não reciclará objetos de singleton, a menos que a conexão estaticamente referenciada a objetos de singleton no singleton esteja artificialmente desconectada.
Em relação a essa controvérsia, o autor escreveu um artigo separado para discuti -lo. Se você tem opiniões diferentes ou experimentou isso, digite o artigo Singleton Model Discussion: Singleton Model and Lipe Collection Participe da discussão.
Vários singletons aparecerão em uma JVM
No caso de sistemas distribuídos, vários carregadores de classe e serializados, vários singletons serão gerados, o que é sem dúvida verdadeiro. Então, um singleton será gerado na mesma JVM? Somente o mesmo singleton pode ser obtido usando o método getInstance () fornecido pelo Singleton, a menos que o método de reflexão seja usado, um novo singleton será obtido. O código é o seguinte
Classe C = classe.ForName (singleton.class.getName ()); Construtor CT = c.getDecLaredConstructor (); ct.setAccessible (true); Singleton Singleton = (Singleton) Ct.NewInstance ();
Dessa forma, cada execução produzirá um novo objeto Singleton. Portanto, ao usar o modo Singleton, tenha cuidado para não usar a reflexão para gerar novos objetos de singleton.
O tópico preguiçoso de singleton é seguro?
São principalmente algumas declarações on-line que o padrão preguiçoso de singleton é inseguro. Mesmo adicionar a palavra -chave sincronizada ao método de instanciação ainda é perigosa. No entanto, após a codificação dos testes, descobri que, depois de adicionar a palavra-chave sincronizada para modificá-la, embora tenha um impacto parcial no desempenho, é seguro para encadeamento e não instancia vários objetos.
Existem apenas dois tipos de modos de singleton: estilos famintos e preguiçosos?
Singleton faminto e singleton preguiçoso são apenas dois métodos de padrões de singleton relativamente mainstream e comumente usados. Teoricamente, qualquer padrão de design que possa implementar apenas uma instância de uma classe pode ser chamado de padrão de singleton.
As aulas de singleton podem ser herdadas?
Como o método de construção é privado, eles não são herdáveis, mas muitos outros padrões de singleton podem ser herdados, como singletons registrados.
É melhor ser um singleton faminto ou um singleton preguiçoso
Em Java, o faminto Singleton é melhor que o lento singleton. Em C ++, geralmente são usados singletons preguiçosos.
O padrão Singleton é relativamente simples, por isso não vou dar um exemplo de demonstração de código aqui.