공장 방법 모드
물체를 만드는 동기는 종종 복잡한 프로세스가 필요하므로 복합 공장에 포함시키는 데 적합하지 않습니다. 새로운 제품이 있으면 복합 공장을 수정해야하며 확장에는 도움이되지 않습니다.
또한 일부 객체의 생성에는 복합 공장에서 액세스 할 수없는 정보가 필요할 수 있습니다. 따라서 공장 인터페이스를 정의 하고이 인터페이스를 구현하여 인스턴스화되는 제품을 결정하십시오. 이것은 클래스의 인스턴스화를 서브 클래스로 지연시키는 공장 방법 패턴입니다.
목적
1. 인터페이스를 정의하고 서브 클래스가 인스턴스화 할 제품을 결정하게하십시오.
2. 공통 인터페이스를 통해 객체를 만듭니다.
성취하다
1. 제품 인터페이스 및 특정 제품은 이해하기 쉽습니다.
2. 공장 클래스는 제품 객체를 반환하는 공장 방법을 제공합니다. 그러나이 공장 방법은 추상적입니다.
3. 특정 공장에서 공장 방법을 구현하고 특정 제품의 생성을 완료하십시오.
// 여러 버튼 클래스 클래스 버튼 {/* ...*/} 클래스 WinButton 확장 버튼 {/* ...*/} 클래스 MacButton 확장 버튼 {/* ...*/} // 공장 클래스 인터페이스 ButtonFactory {Abstract Button CreateButton (); } class winButtonFactory 구현 버튼 {button createbutton () {return new WinButton (); }} class macButtonFactory empless buttonFactory {button createbutton () {return new MacButton (); }} 해당 시나리오
1. 객체를 만들 때 더 많은 중복 코드가있을 때 공장 메소드 패턴을 사용 하여이 중복 부품을 실행하는 것을 고려할 수 있습니다.
2. 객체 생성에는 공장 클래스에 포함되지 않아야하는 특정 정보에 대한 액세스가 필요합니다. 그런 다음 서브 클래스는 객체의 생성을 구현할 수 있습니다.
3. 프로그램의 일관성을 유지하기 위해 객체 생성을 중앙에서 관리해야 할 때.
추상 공장 패턴
추상 공장 패턴을 정의하면 동일한 테마로 별도의 공장 세트를 캡슐화하는 방법이 제공됩니다. 정상적인 사용에서 클라이언트 프로그램은 추상 공장의 구체적인 구현을 만들고 추상 공장을 인터페이스로 사용 하여이 주제에 대한 콘크리트 객체를 만들어야합니다. 클라이언트 프로그램은 이러한 내부 공장 메소드에서 특정 유형의 객체를 가져 오는 것을 알 필요가 없습니다. 클라이언트 프로그램은 이러한 객체의 공통 인터페이스 만 사용하기 때문입니다. 추상 공장 패턴은 객체 세트의 구현 세부 사항을 일반적인 사용과 분리합니다.
"공장"은 제품 (객체)이 생성되는 곳이며, 그 목적은 제품 생성을 사용과 분리하는 것입니다. 추상 공장 모델의 목적은 여러 추상 제품의 인터페이스를 다른 테마 제품의 특정 구현과 분리하는 것입니다. 이렇게하면 새로운 특정 공장을 추가 할 때 초록 공장을 참조하는 클라이언트 코드를 수정할 필요가 없습니다.
추상 공장 패턴을 사용하면 런타임에서도 공장을 사용하여 클라이언트 코드를 수정하지 않고 특정 공장을 변경할 수 있습니다. 그러나이 패턴 또는 이와 유사한 설계 패턴을 사용하면 불필요한 복잡성과 코드 작성에 추가 작업이 제공 될 수 있습니다. 디자인 패턴을 올바르게 사용하면 이러한 "추가 작업"을 상쇄 할 수 있습니다.
성취하다
1. AbstractFactory- 추상 제품을 생성하기위한 인터페이스 방법을 정의합니다.
2. ConcreteFactory- 구현 방법 특정 제품을 생성하는 방법.
3. AbstractProduct- 다양한 유형의 제품을 선언하는 인터페이스.
4. 제품 - 콘크리트 기능에 해당하는 특정 제품을 정의하고 추상 제품 인터페이스를 구현합니다.
5. 클라이언트 - AbstractFactory 및 Abstract 제품 클래스를 사용하십시오.
추상 클래스 AbstractProducta {public acpract void operata1 (); 공개 초록 void operata2 (); } class producta1은 actractProducta {productA1 (String Arg) {System.out.println ( "hello"+arg); } // 여기에서 코드를 구현 공개 void operata1 () {}; public void operata2 () {}; } class producta2는 actractProducta {productA2 (String arg) {System.out.println ( "Hello"+arg); } // 여기에서 코드를 구현 공개 void operata1 () {}; public void operata2 () {}; } Abstract Class AbstractProductb {// public acpract void operationb1 (); // 공개 초록 void OperationB2 (); } class productb1은 AbstractProductb {productb1 (String arg) {system.out.println ( "hello"+arg); } // 여기에서 코드 구현} class productb2는 acpractProductB {productB2 (String Arg) {system.out.println ( "hello"+arg); } // 여기에서 코드 구현} acpract class actractFactory {Abstract AbstractProducta createProduate (); Abstract AbstractProductb CreateProductb (); } Class ConcreteFactory1 확장 atbractFactory {AbstractProducta createProducta () {return New ProductA1 ( "ProductA1"); } AbstractProductb createProductb () {return new productb1 ( "productb1"); }} Class ConcreteFactory2는 acpractFactory {AbstractProducta CreateProducta () {return New ProductA2 ( "ProductA2"); } AbstractProductb createProductb () {return new productb2 ( "productb2"); }} // 공장 제작자 - 공장 클래스 공장 제작자 {private static acholdractory pf = null; 정적 추상적 변수 getFactory (String Choice) {if (선택 .Equals ( "a")) {pf = new ConcreteFactory1 (); } else if (choice.equals ( "b")) {pf = new ConcreteFactory2 (); } 반환 pf; }} // 클라이언트 공개 클래스 클라이언트 {public static void main (String args []) {acpractFactory pf = factoryMaker.getFactory ( "a"); AbstractProducta Product = Pf.CreateProducta (); // 제품에서 더 많은 함수 호출}}FactoryMaker 클래스는 간단한 공장 모드를 사용하는 반면 특정 공장의 구현은 공장 방법 모드를 사용합니다.
해당 시나리오
1. 시스템은 제품의 생성, 구성 및 표현과 무관합니다.
2. 시스템이 여러 제품 패밀리 중 하나에 의해 구성되는 경우.
3. 공동 사용을 위해 일련의 관련 제품 객체의 설계를 강조해야합니다.
4. 제품 라이브러리를 제공하고 구현 대신 인터페이스 만 표시하려고합니다.
이점
1. 특정 제품은 고객 코드와 분리됩니다
2. 쉽게 바꿀 수있는 시리즈
3. 일련의 제품 패밀리를 함께 만듭니다
결점
1. 제품 패밀리에서 신제품을 확장하는 것은 어렵고 추상 공장과 특정 공장의 인터페이스를 수정해야합니다.