간략한 소개
은 "머리 먼저 디자인 패턴"공장 모드에 따라 세 가지가 있습니다 : 정적 팩토리 메소드 , 팩토리 메소드 , 추상적 인 공장. 이 문서에서는 추상 공장을 설명합니다.
1 의 정의 : 필요없이, 관련 또는 종속 객체의 가족을 만들기위한 인터페이스를 제공하는 특정 클래스를 지정합니다.
2 의 충족 OO의 원칙 - 추상에 의존하는 특정 클래스에 의존하지 않는 : 종속성 반전 원리를.
3 , 구조 패턴 : 팩토리 클래스 (추상과 콘크리트 공장 공장) 및 제품 클래스 (추상과 콘크리트 제품 제품)
4 , 특정 구현 ( 전체 코드 ) :
같은 공장 방법이 너무 구체적인 작성자 클래스와 같은 지역의 피자 맛을 구현하는 것을, 우리는 피자 맛이 증가 할 수있다, 추상적 인 디자인 피자를 기반으로, 피자 시스템을 수행하지만,이 경우, 확장 성이 충분하지 않습니다 새로운 피자 맛이 다른 재료와 함께 표시하는 경우, 우리는 여전히 추상적 제품 클래스를 변경해야하기 때문에 (피자 클래스 ) 및 특정 제품 범주를 확장. 추상 공장은 원료가 증가 또는 감소 한 경우 우리는 우리가 원료 변경 될 수 피자의 생산에 대해 서로 다른 원료를 원료 (추상 팩토리 클래스)를 만든 다음 선택해야하므로, 공장 설계로 추출 원료를 기반으로 클래스는, 동시에 이러한 변화는 다른 클래스에 영향을주지 않습니다 수 있습니다. (공장 출하시에있어서, 원료의 감소는, 그것이 비교적 큰 변화이며,이 재료를 포함하는 특정 상품 카테고리의 수를 변경할 수있는 경우)
- 추상 팩토리 클래스 : 인터페이스를 정의하고, 모든 콘크리트 공장이 인터페이스를 구현해야합니다, 특정 시설의 모든 제품을 생산하기 위해 사용되는 방법의 세트를 포함하는이 인터페이스를 구현해야합니다.
공중 인터페이스 PizzaIngredientFactory { 공개 반죽 createDough (); 공개 소스 createSauce (); 공공 치즈 createCheese (); 공개 채소 [] createVeggies (); 공공 페퍼로니 createPepperoni (); 공공 조개 createClam (); }
- 콘크리트 공장 클래스 : 제품을 만들기 위해, 다양한 제품군을 달성는, 고객은 단순히 공장 중 하나 완전히 모든 제품 객체가 인스턴스화하지 않고 사용합니다.
// 시카고 피자 식물 재료를 만드는 공공의 클래스 ChicagoPizzaIngredientFactory에게 구현을 PizzaIngredientFactory { // 반죽 공공 반죽 createDough () { 반환 새 새 ) ThickCrustDough을 (; } // 酱料 공개 소스 createSauce () { 반환 새 ) (PlumTomatoSauce을; } // 芝士 공공 치즈 createCheese () { 반환 새 ) (MozzarellaCheese을; } // 蔬菜 공개 채소 [] createVeggies () { 채소 채소 [] = { 새로운 시금치 (), 새로운 BlackOlives (), 새로운 가지 ()}; 반환 채소를; } // 意式腊肠 공공 페퍼로니 createPepperoni () { 반환 새 ) SlicedPepperoni을 (; } // 蛤蜊 공공 조개 createClam () { 반환 새 ) (FrozenClams을; } } // 뉴욕 피자 원료 공장 수 있도록 공공 클래스 NYPizzaIngredientFactory에게 구현을 PizzaIngredientFactory가 { // 반죽 공공 반죽 createDough () { 반환 새 새 ) (ThinCrustDough을; } // 酱料 공개 소스 createSauce () { 반환 새 ) (마리 나라 소스를; } // 芝士 공공 치즈 createCheese () { 반환 새 ) (ReggianoCheese을; } // 蔬菜 공개 채소 [] createVeggies () { 채소 채소 [] = { 새로운 마늘 (), 새로운 양파 (), 새로운 버섯 (), 새로운 RedPepper ()}; 반환 채소를; } // 意式腊肠 공공 페퍼로니 createPepperoni () { 반환 새 ) SlicedPepperoni을 (; } //는 조개 공공 조개 createClam는 () { 반환 새로운 새로운 FreshClams을 (); } }
- 추상 제품 카테고리 :
// 시작 재료 : 반죽 공용 인터페이스 반죽 { 공공 문자열 toString (); } // 출발 물질 : 살라미 공용 인터페이스 페퍼로니 { 공공 문자열 toString (); }
- 특정 제품 카테고리 :
@ 반죽 : 반죽 두께 공공 클래스 ThickCrustDough 구현 반죽 { 공공 문자열 toString () { 반환 "두꺼운 크러스트 반죽" ; } } @ 반죽 : 얇은 반죽 공공 클래스 ThinCrustDough 구현 반죽 { 공공 문자열 toString () { 반환 "씬 크러스트 반죽" ; } } // 살라미 : 살라미 슬라이스 공공의 클래스 SlicedPepperoni 구현 페퍼로니 { 공공 문자열 toString () { 반환 "슬라이스 페퍼로니" ; } }
- 클라이언트 : 클라이언트 코드 단지 추상적 인 공장 설계, 자동으로 실제 공장 작업을 사용합니다.
// 뉴욕 스타일의 피자 공공의 클래스 NYPizzaStore는 를 확장 PizzaStore { 보호 {피자 createPizza (문자열 항목) 피자 피자 = 널 (null) ; PizzaIngredientFactory ingredientFactory는 = 새로운 NYPizzaIngredientFactory을 (); 경우 (item.equals ( "치즈" )) { 피자 = 새로운 CheesePizza (ingredientFactory)를; pizza.setName ( "뉴욕 스타일의 치즈 피자" ); } 다른 경우 (item.equals ( "채식주의 자" )) { 피자 = 새로운 VeggiePizza (ingredientFactory)를; pizza.setName ( "뉴욕 스타일 채식 피자" ); } 다른 경우 (item.equals ( "조개" )) { 피자 = 새로운 ClamPizza (ingredientFactory)를; pizza.setName ( "뉴욕 스타일 조개 피자" ); } 다른 경우 (item.equals ( "페퍼로니" {)) 피자 = 새로운 PepperoniPizza (ingredientFactory)를; pizza.setName ( "뉴욕 스타일 페퍼로니 피자" ); } 반환 피자; } } // 시카고 스타일 피자는 공공 클래스는 ChicagoPizzaStore (가) 확장 PizzaStore { 보호 {피자 createPizza (문자열 항목) 피자 피자 = 널 (null) ; PizzaIngredientFactory ingredientFactory는 = 새로운 ChicagoPizzaIngredientFactory을 (); 경우 (item.equals ( "치즈" )) { 피자 = 새로운 CheesePizza (ingredientFactory)를; pizza.setName ( "시카고 스타일의 치즈 피자" ); } 다른 경우 (item.equals ( "채식주의 자" )) { 피자 = 새로운 VeggiePizza (ingredientFactory)를; pizza.setName ( "시카고 스타일 채식 피자" ); } 다른 경우 (item.equals ( "조개" )) { 피자 = 새로운 ClamPizza (ingredientFactory)를; pizza.setName ( "시카고 스타일 조개 피자" ); } 다른 경우 (item.equals ( "페퍼로니" {)) 피자 = 새로운 PepperoniPizza (ingredientFactory)를; pizza.setName ( "시카고 스타일 페퍼로니 피자" ); } 반환 피자; } }
5 , 추상 공장의 장점 : 당신은 관련 제품의 그룹의 컬렉션을 함께 넣을 수 있습니다
6 , 추상적 인 공장 단점 : 더 어려운 제품의 새로운 유형을 추가.
7 , 팩토리 메소드 및 추상 팩토리 차이 :
- 추상 팩토리 객체를, 클래스 팩토리를 사용하여 사용하는 방법
- 팩토리 메소드는 객체를 결합하여 개체를 만들 상속, 추상 팩토리를 사용하여 개체를 만들 수 있습니다.
참고 : 고객이 특정 유형에서 분리 모두 책임이 있지만, 다른 방법 : 팩토리 메소드는 객체 클래스를 확장하고 공장의 메소드를 오버라이드 (override) 할 필요를 생성하고, 추상 공장 추상의 유형을 생성하는 데 사용되는 제품군을 제공합니다 서브 클래스의이 유형은이 기능을 사용하기 위해서는, 먼저 인스턴스화하고 추상 형식의 코드를 작성 그것의 일부를 통과해야합니다에서, 제품 생산하는 방법을 정의합니다.
참고 자료
[1] 제 머리 디자인 패턴