Java에서, 당신은 여전히 수업을 인스턴스화하기위한 새로운 해당 객체를 변경하지 않았습니까?
더 많은 프로젝트를 수행하면 코드 쓰기의 양이 자연스럽게 증가하며 점차 디자인 패턴을 느낄 수 있습니다.
서면 클래스 인스턴스화 동작, 높은 응집력, 낮은 커플 링 및 특정 확장 기능을 만드는 방법은 무엇입니까?
이 기사는 모든 자바 인스턴스테이션 클래스를 모든 사람에게 제시하기 위해 몇 가지 생생한 코드로 시작하려고합니다.
다음 코드는 com.google.zxing 소스 코드 구현에서 가져옵니다.
public bitmatrix encode (문자열 목차, 바코드 포름 형식, int 너비, int 높이, 맵 <encodehinttype,?> hints) writeerexception {object writer; switch (format.ordinal ()) {case 1 : writer = new aztecwriter (); 부서지다; 사례 2 : Writer = 새로운 codabarwriter (); 부서지다; 사례 3 : Writer = 새 Code39Writer (); 부서지다; 사례 4 : 사례 10 : 사례 13 : 사례 14 : 기본값 : 새로운 불법 행위 exception ( "형식에 사용할 수있는 인코더 없음" + 형식); 사례 5 : Writer = 새로운 Code128Writer (); 부서지다; 사례 6 : Writer = New DatamatrixWriter (); 부서지다; 사례 7 : Writer = 새로운 ean8writer (); 부서지다; 사례 8 : Writer = 새로운 ean13writer (); 부서지다; 사례 9 : Writer = New Itfwriter (); 부서지다; 사례 11 : Writer = New PDF417Writer (); 부서지다; 사례 12 : Writer = New QRCodeWriter (); 부서지다; 사례 15 : Writer = New Upcawriter (); 부서지다; 사례 16 : Writer = New UpceWriter (); } return ((Writer) Writer) .encode (내용, 형식, 너비, 높이, 힌트); }Barcodeformat은 다음과 같습니다.
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_expeded, upc_a, upc_e, upc_ean_extension; private barcodeformat () {}} 소스 코드에서 제공하는 기능은 여러 가지 유형의 바코드 전선을 통해 정보를 비트 매트릭스로 출력 한 다음 그림에 출력하여 어디에서나 볼 수있는 다양한 유형의 바코드를 형성하는 것입니다.
bitmatrix bitmatrix = new multiformatwriter (). encode (_text, barcodeformat.qr_code, qrcodewidth, qrcodeheight, hints);
matrixtoImageWriter.writetOfile (bitmatrix, qrcodeformat, qrcodefile);
소스 코드 저자는 여기 JDK 1.5에 도입 된 새로운 기능 Enum Enum 클래스를 사용하고 Barcodeformat 클래스를 작성하여 다양한 유형의 바코드의 속성을 정의합니다.
열거 클래스에서 매개 변수 barcodeformat.xx의 시퀀스 번호에 따라 특정 클래스를 인스턴스화하려면 multiformatwriter.encode ()를 호출하십시오.
switch (format.ordinal ()) {case 1 : writer = new aztecwriter (); 부서지다; 사례 2 : Writer = 새로운 codabarwriter (); 부서지다; 사례 3 : Writer = 새 Code39Writer (); 부서지다; ............ 이 바코드 라이터 클래스는 추상 인터페이스 작성자의 두 가지 encode () 메소드를 구현합니다.
public Interface Writer {bitmatrix encode (String var1, barcodeformat var2, int var3, int var4)는 writeRexception을 던졌습니다. Bitmatrix encode (String var1, barcodeformat var2, int var3, int var4, map <encodehinttype,?> var5)는 writeRexception;}를 던집니다.특정 바코드 WIRTER 클래스는 다양한 유형의 바코드 규칙을 기반으로 다른 논리를 수행합니다.
사용자는 내부 구현에 너무 많은 관심을 기울일 필요가 없습니다. 그들은 어떤 종류의 바코드를 선택하고 적절한 바코드 유형을 사용해야하는지 생성해야합니다. 위의 예는 QR 코드에서 구현됩니다.
클래식 MVC 프레임 워크 웹 워크의 동적 인스턴스화 클래스에 대한 메소드 코드를 살펴 보겠습니다.
비공개 정적 구성 getDefaultConfiguration () {if (defaultImpl == null) {defaultImpl = new defaultConfiguration (); try {string classname = getString ( "work.configuration"); if (! className.equals (defaultImpl.getClass (). getName ())) {try {defaultImpl = (configuration) objectFactory.getObjectFactory (). buildBean (thread.currentThread (). getContextClassLoader (). loadClass (className)); } catch (예외 e) {log.error ( "구성 할 수 없음", e); }} return defaultimpl; } catch (localElegalArgumentException) {}}}소스 코드는 웹 워크 코어에서 가져옵니다. 많은 관중들은 웹 워크에 대해 들어 보지 못했을 수도 있지만 스트럿은 잘 알려져 있어야합니다. Struts2 Core는 웹 워크에서 다시 작성됩니다.
위 소스 코드에서 제공하는 함수는 사용자가 정의한 구성 파일 읽기 클래스를 인스턴스화하는 것이며 정의는 구성 파일에 있습니다.
소스 코드 작성자는 thread.currentthread (). getContextClassLoader (). loadClass (className) 클래스 로더를 사용하여 가장 효율적인 방법 인 사용자 정의 구성 파일 읽기 클래스를 동적으로 인스턴스화합니다.
클래스 로더의 대표 체인 : SystemClassLoader-> ExtensionClassLoader-> BootStrapClassLoader
대표 체인의 왼쪽에있는 클래스 로더는 오른쪽의 클래스 로더로로드 된 클래스를 자연스럽게 사용할 수 있습니다. 클래스 로딩 메커니즘은 클래스를로드하는지 여부를 결정하는 것이며 우수한 것을 요구하지 않습니다.
이 3 개의 클래스 로더는 컴파일러의 우선 순위와 클래스 파일을 찾기위한 다른 경로에 해당합니다.
Class.forname () 일일 프로젝트에 사용 된 부트 스트랩 클래스 로더 (Bootstrapclassloader)에서 가장 자원이 소비되는 부트 스트랩 클래스 로더 (Bootstrapclassloader)에서 묻기 시작합니다.
소스 코드 저자는 여기에서 SystemClassLoader에 해당하는 스레드 클래스 로더를 사용합니다.