[디자인 모드] 공장 패턴 - 추상 공장

간략한 소개

은 "머리 먼저 디자인 패턴"공장 모드에 따라 세 가지가 있습니다 : 정적 팩토리 메소드 , 팩토리 메소드 , 추상적 인 공장. 이 문서에서는 추상 공장을 설명합니다.

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] 제 머리 디자인 패턴

추천

출처www.cnblogs.com/mj-selina/p/12488855.html