이 기사에서는 Java 디자인 패턴의 공장 모델에 대해 설명합니다. 다음과 같이 참조에 대해 공유하십시오.
1. 간단한 공장
먼저 질문에 대해 생각해 봅시다. 우리가 프로그램을 작성할 때 그러한 상황이있을 것입니다. 객체 A는 객체 B의 메소드를 호출해야합니다. 현재, 우리는 일반적으로 새 키워드를 사용하여 인스턴스 B를 작성한 다음 인스턴스 B의 메소드를 호출해야합니다.이 방법의 단점은 클래스 A 메소드가 클래스 B의 클래스 이름을 직접 호출한다는 것입니다 (이 방법을 하드 코딩 커플 링이라고도합니다). 시스템을 리팩토링 해야하는 경우 : 클래스 B 대신 클래스 C를 사용해야 할 때 프로그램은 클래스 A 코드를 수정해야합니다. 응용 프로그램의 100 개 또는 10,000 개의 클래스가 하드 코딩 된 경우 100 또는 10,000 장소를 수정해야합니다. 이는 분명히 매우 끔찍한 것입니다.
다른 관점 에서이 문제를 보면 이미 객체 B의 방법 만 호출하면 B의 구현 및 생성 프로세스에 대해서만 신경 쓰지 않아도 Class B가 IB 인터페이스를 구현하도록 고려하는 반면, 클래스 A 만 IB 인터페이스와 결합해야 할 필요가 있습니다. -Class A는 B 인스턴스를 생성하기 위해 새 키워드를 직접 사용하지는 않지만 공장 클래스를 사용하지는 않습니다. IBFactory 공장에 전화하여 IB 인스턴스를 얻습니다. 위의 디자인을 통해 : 클래스 B 대신 클래스 C를 사용해야하는 경우 클래스 C가 IB 인터페이스를 구현하고 IBFactory Factory에서 IB 인스턴스를 생성하기위한 구현 코드를 다시 작성하여 공장에서 C 인스턴스를 생성 할 수 있도록해야합니다. 여러 클래스 객체를 Generation for Generation의 공장 클래스에 전달하는이 설계 방법을 간단한 공장 패턴이라고합니다.
간단한 공장 패턴에 대한 코드는 다음과 같습니다.
/*** 간단한 공장 모드* 공장 제작 객체 인스턴스* 헤어 스타일 인터페이스* @Author 관리자*/공개 인터페이스 헤어 {/*** Draw Hair Style*/public void draw ();}/*** 좌파 관리자*/public class lefthair void have {) System.out.println("-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- * */public class Righthair는 머리카락을 구현 {@override public void draw () { System.out.println("----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 관리자 */public static void main (string [] args) {hear hear hair.gethair ();보시다시피, Hairtest에서 생성 된 Lefthair를 Hairthair로 변경하려면 Hairfactory에서 Gethair 방법의 구현을 수정하면됩니다.
간단한 공장 모드를 사용하는 장점은 객체 발신자와 객체 생성 프로세스를 분리한다는 것입니다. 객체 발신자가 객체가 필요할 때, 객체가 공장에서 직접 요청하여 객체 발신자와 객체 구현 클래스가 하드 코딩 된 방식으로 결합되어 시스템의 유지 관리 및 확장 성을 향상시킬 수 있습니다. 물론 공장 모델에는 약간의 결함이 있습니다. 제품이 수정되면 공장 클래스도 그에 따라 수정해야합니다. 여기서 정책 모델을 사용하여 해결할 수 있습니다. 다음은 코드입니다.
공개 인터페이스 헤어 빌더 { / *** 헤어 스타일 만들기* @return* / public hair gethair ();} 공개 클래스 LefthairBuilder는 Hairbuilder {@override public hair gethair () {return new Lefthair (); }} public class righthairbuilder는 Hairbuilder {@override public hair gethair () {return new righthair (); }} 공개 클래스 헤어 Factory {Private Hairbuilder Hairbuilder; 공개 모발 (Hairbuilder Hairbuilder) {this.heairbuilder = Hairbuilder; } public void sethairbuilder (Hairbuilder Hairbuilder) {this.heairbuilder = Hairbuilder; } public hair gethair () {return Hairbuilder.gethair (); }} 공개 클래스 헤어 테스트 {public static void main (String [] args) {// Hairbuilder Builder = New LefthairBuilder (); Hairbuilder Builder = New RighthairBuilder (); 모발 공장 = 새로운 털파드 (Builder); 헤어 헤어 = factory.gethair (); Hair.Draw (); }}이 접근법의 장점은 더 이상 공장 클래스를 수정할 필요가 없으며 다른 전략에 따라 공장의 창조 논리를 추상화 할 필요가 없다는 것입니다. 프로그램을 작성 해야하는 객체는 무엇입니까? 해당 빌더를 네트워크 공장으로 전달하십시오.
2. 공장 방법
간단한 공장 모델 에서이 시스템은 공장 클래스를 사용하여 모든 제품 인스턴스를 생성하며 공장 클래스는 어떤 클래스를 생산할 인스턴스, 즉 공장 클래스가 모든 논리적 판단, 인스턴스 제작 및 기타 작업에 책임이 있습니다.
공장 수업에서 논리적 판단을 원하지 않는 경우, 프로그램은 다른 제품 범주에 대해 다른 공장을 제공 할 수 있으며, 다른 공장 수업은 공장 수업에서 복잡한 논리적 판단을 내리지 않고 다른 제품을 생산합니다. 이것은 위의 전략 모델과 결합 된 간단한 공장 모델과 약간 유사합니다. 차이점은 전자는 하나의 공장 만 있고 후자는 여러 공장이 필요하다는 것입니다. 아래는 공장 방법 패턴에 대한 코드입니다.
/*** 팩토리 메서드 패턴* 공장에서 제작 한 객체 인스턴스에 의해 구현 해야하는 일반적인 인터페이스* @author 관리자**/public interface person {public void drawperson ();} 공개 클래스 남자 {@override public void drawperson () { System.out.println("---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- System.out.println("------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- @Author 관리자 */공개 클래스 여성은 PersonFactory {@Override public person getPerson () {Client Test Class */Public Class PersonTest {Public Static void Main (문자열) {// personfactory (periblory factory); factory.getperson ();이러한 종류의 전형적인 특징은 고객 코드의 다른 공장에 따라 해당 제품을 생산하며 모든 복잡한 논리를 공장 클래스에 넣을 필요가 없다는 것입니다. 이 구현에는 명백한 결함이 있는데, 이는 클라이언트가 공장 클래스와 결합된다는 것입니다.
3. 초록 공장
공장 메소드의 위의 설계 아키텍처를 사용하여 클라이언트 코드는 호출 된 객체의 구현 클래스와 성공적으로 분리되지만 다른 커플 링을 가져옵니다. 클라이언트 코드는 다른 공장 클래스와 결합됩니다. 이 커플 링 문제를 해결하려면 팩토리 클래스를 추가하여 공장 인스턴스를 생성하고 제품을 생산하기 위해 클라이언트와 공장을 분리하십시오. 이 설계 방법을 추상 공장 모델이라고합니다. 아래는 추상 공장 패턴에 대한 코드입니다
/*** 초록 공장 패턴* 공장 생산 인원 factory* @author 관리자**/public class personfactoryfactory {public static personfactory getpersonfactory (String type) {if (type.equalsignorecase ( "man")) {return new manfactory (); } else {return new womenFactory (); }}}/** * 클라이언트 테스트 클래스 * @Author 관리자 * */public class personTest {public static void main (string [] args) {personfactory factory = personfactoryfactory.getPersonFactory ( "man"); 개인 = inctory.getperson (); person.drawperson (); }}더 많은 Java 관련 컨텐츠를 보려면이 사이트에 관심이있는 독자는 "Java 데이터 구조 및 알고리즘 자습서", "Java Operation Dom Node Tips 요약", "Java 파일 및 디렉토리 작동 팁 요약 및"Java Cache Cache Operation Tips "의 주제를 볼 수 있습니다.
이 기사가 모든 사람의 Java 프로그래밍에 도움이되기를 바랍니다.