Em Java, você ainda está inalterado novos objetos correspondentes para instantar a classe?
Com mais projetos em mãos, a quantidade de redação de código aumentará naturalmente e, gradualmente, você sentirá o padrão de design.
Como fazer as ações de instanciação por classe escrita, alta coesão, baixo acoplamento e certas capacidades de expansão?
Este artigo tenta começar com alguns códigos vívidos para apresentar diferentes classes de instanciação de Java a todos.
O código a seguir é retirado da implementação do código -fonte com.google.zxing:
Public bitMatrix Encode (conteúdo da string, formato de formato de barro, int width, int altura, mapa <codehinttype ,?> dicas) lança writerexception {objeto writer; switch (format.ordinal ()) {case 1: writer = new AztecWriter (); quebrar; Caso 2: Writer = new Codabarwriter (); quebrar; Caso 3: Writer = new Code39Writer (); quebrar; Caso 4: Caso 10: Caso 13: Caso 14: Padrão: Jogue Novo IllegalArgumentException ("Nenhum codificador disponível para formato" + formato); Caso 5: Writer = new Code128Writer (); quebrar; Caso 6: Writer = new DatamatrixWriter (); quebrar; Caso 7: Writer = new EAN8Writer (); quebrar; Caso 8: Writer = new EAN13Writer (); quebrar; Caso 9: Writer = new ItfWriter (); quebrar; Caso 11: Writer = New PDF417Writer (); quebrar; Caso 12: Writer = New Qrcodewriter (); quebrar; Caso 15: Writer = New UpCawriter (); quebrar; Caso 16: Writer = new UpceWriter (); } return ((escritor) escritor) .encode (conteúdo, formato, largura, altura, dicas); }O BarcodeFormat é assim:
public enum barcodeformat {Aztec, codabar, code_39, code_93, code_128, data_matrix, ean_8, ean_13, itf, maxicode, pdf_417, qr_code, rss_14, rss_expAid, upc_a, upc_c_c_c_c_c_c_c_c_c_c_c_c_c_c_c_c_c_c_c_c_c_c_c_c_c_c_c_c_c_c_c_c_c_c_c_c_c_c_c_c_c_c_c_c_c_c_c_c_c_c_c_c_c_c_c_c_c_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_C_CEDC_CELA, UPC_CELA, UPC_CELE, Private BarcodeFormat () {}} A função fornecida pelo código -fonte é produzir informações em uma matriz de bits através de vários tipos diferentes de hirters de código de barras e, em seguida, produzi -las para a figura para formar vários tipos de códigos de barras que podem ser vistos em todos os lugares.
BitMatrix bitMatrix = new MultInFalMATWriter (). Encode (_Text, barcodeFormat.qr_code, qrcodewidth, qrcodeHeight, dicas);
MatrixToImageWriter.WriteTofile (BitMatrix, QRCodeFormat, QRCodeFile);
O autor do código -fonte usa a nova classe Enum Enum, introduzida no JDK 1.5 aqui e escreveu a classe BarcodeFormat, que define as propriedades de diferentes tipos de códigos de barras.
Ligue para MultInFalMATWriter.Encode () para instanciar a classe específica de acordo com o número de sequência do parâmetro BarcodeFormat.xx na classe de enumeração.
switch (format.ordinal ()) {case 1: writer = new AztecWriter (); quebrar; Caso 2: Writer = new Codabarwriter (); quebrar; Caso 3: Writer = new Code39Writer (); quebrar; ............ Essas classes de redatores de código de barras implementam dois métodos Encodes () do escritor abstrato da interface.
Public Interface Writer {BitMatrix Encode (String var1, BarcodeFormat var2, int var3, int var4) lança WriteRexception; BitMatrix Encode (String var1, BarcodeFormat Var2, int var3, int var4, map <EncodeHintType ,?> var5) lança Writerexception;}A classe específica do WIRTER de código de barras executa diferentes lógicas com base em diferentes tipos de regras de código de barras.
Os usuários não precisam prestar muita atenção à implementação interna. Eles precisam gerar que tipo de código de barras precisam escolher e usar o tipo de código de barras apropriado. Os exemplos acima são implementados no código QR.
Vejamos um código de método para a classe de instanciação dinâmica da Web do clássico MVC Framework:
Configuração estática privada getDefaultConfiguration () {if (defaultImpl == null) {defaultImpl = new defaultConfiguration (); tente {string className = getString ("webwork.configuration"); if (! className.equals (defaultImpl.getClass (). getName ())) {try {defaultImpl = (Configuration) objectFactory.getObjectFactory (). BuildBean (thread.currentThread (). getContextClassLoader (). loadclass (className)); } catch (Exceção e) {log.error ("Não foi possível instanciar a configuração", e); }} retorna defaultImpl; } catch (ilegalargumentException localilleLeGalArgumentException) {}}}O código-fonte é retirado do webwork-core. Muitos espectadores podem não ter ouvido falar da Web, mas os suportes devem ser bem conhecidos. O núcleo do Struts2 é reescrito da Webwork.
A função fornecida pelo código -fonte acima é instanciar a classe de leitura do arquivo de configuração definida pelo usuário e a definição está no arquivo de configuração.
O autor do código -fonte usa o thread.currentThread (). GetContextClassLoader (). LoadClass (ClassName) Loader no thread para instantar dinamicamente instantar as classes de leitura de arquivos de configuração personalizada, que é a maneira mais eficiente.
Cadeia delegada carregador de classe: SystemClassLoader -> ExtensionClassLoader -> BootstrapClassLoader
O carregador de classe no lado esquerdo da cadeia de delegação pode usar naturalmente a classe carregada pelo carregador de classe à direita. O mecanismo de carregamento de classe é determinar se está carregando a classe e não está pedindo ao superior.
Esses três carregadores de classe correspondem à prioridade do compilador e aos diferentes caminhos para encontrar o arquivo de classe:
Class.ForName () Usado em projetos diários começará a pedir o BootstrapClassLoader, que é o mais consumidor de recursos.
O autor do código -fonte usa um carregador de classe Thread aqui, correspondente ao SystemClassLoader, que é sem dúvida a maior eficiência.