팩토리 디자인 패턴과 추상 팩토리 디자인 패턴의 기본적인 차이점은 무엇입니까?[닫은]

StackOverflow https://stackoverflow.com/questions/1001767

문제

팩토리 패턴과 추상 팩토리 패턴의 기본적인 차이점은 무엇입니까?

도움이 되었습니까?

해결책

공장 패턴을 사용하면 구현 인스턴스를 생성합니다 (Apple, Banana, Cherry, 특정 인터페이스의 등. IFruit.

추상 공장 패턴을 사용하면 누구나 자신의 공장을 제공 할 수있는 방법을 제공합니다. 이를 통해 창고는 중 하나 일 수 있습니다 IFruitFactory 또는 IJuiceFactory, 창고가 과일이나 주스에 대해 아는 것을 필요로하지 않고.

다른 팁

이 정보의 출처는 다음과 같습니다. http://java.dzone.com/news/intro-design-patterns-abstract

추상 공장 대 추상 공장팩토리 메소드

추상 팩토리의 메소드는 팩토리 메소드로 구현됩니다.추상 팩토리 패턴과 팩토리 메소드 패턴은 모두 추상 유형과 팩토리를 통해 클라이언트 시스템을 실제 구현 클래스에서 분리합니다.Factory Method는 Abstract Factory가 구성을 통해 객체를 생성하는 상속을 통해 객체를 생성합니다.

추상 팩토리 패턴은 AbstractFactory, ConcreteFactory, AbstractProduct, ConcreteProduct 및 클라이언트로 구성됩니다.

구현 방법

추상 팩토리 패턴은 팩토리 메소드 패턴, 프로토타입 패턴 또는 싱글톤 패턴을 사용하여 구현할 수 있습니다.ConcreteFactory 객체는 단 하나의 ConcreteFactory 객체 인스턴스가 필요하므로 Singleton으로 구현될 수 있습니다.

팩토리 메소드 패턴은 추상 팩토리 패턴을 단순화한 버전입니다.팩토리 메소드 패턴은 한 제품군에 속하는 제품을 생성하는 역할을 담당하는 반면, 추상 팩토리 패턴은 여러 제품군을 처리합니다.

팩토리 메소드는 인터페이스와 추상 클래스를 사용하여 클라이언트를 생성기 클래스 및 결과 제품에서 분리합니다.Abstract Factory에는 생성기와 제품에서 클라이언트를 분리하는 인터페이스와 함께 여러 팩토리 메서드에 대한 컨테이너인 생성기가 있습니다.

팩토리 메소드 패턴을 사용해야 하는 경우

클라이언트가 사용하는 특정 제품에서 클라이언트를 분리해야 할 경우 팩토리 메서드 패턴을 사용하세요.제품 인스턴스 생성 및 구성에 대한 클라이언트의 책임을 완화하려면 팩토리 메소드를 사용하십시오.

추상 팩토리 패턴을 사용해야 하는 경우

클라이언트를 제품 클래스에서 분리해야 하는 경우 추상 팩토리 패턴을 사용합니다.특히 프로그램 구성 및 수정에 유용합니다.추상 팩토리 패턴은 어떤 클래스를 다른 클래스와 함께 사용해야 하는지에 대한 제약을 적용할 수도 있습니다.새로운 콘크리트 공장을 짓는 것은 많은 일이 될 수 있습니다.

예:

추상 팩토리 예제 1

파스타 메이커에서 다양한 유형의 파스타를 준비하기위한 디스크의 사양은 추상 공장이며 각 특정 디스크는 공장입니다.모든 팩토리(파스타 메이커 디스크)는 추상 팩토리에서 해당 속성을 상속합니다.각 개별 디스크에는 파스타를 만드는 방법에 대한 정보가 포함되어 있지만 파스타 메이커에는 없습니다.

추상 팩토리 예제 2:

스탬핑 장비는 추상 공장에 해당하며, 추상 제품 객체를 생성하는 작업의 인터페이스이므로 초록 공장에 해당합니다.다이는 콘크리트 제품을 만들기 때문에 콘크리트 공장에 해당합니다.각 부품 카테고리(후드, 도어 등)는 추상 제품에 해당합니다.특정 부품 (예 : 99 Camry의 운전자 측면 도어)은 콘크리트 제품에 해당합니다.

팩토리 메소드 예:

장난감 회사는 공장을 사용하여 제품 개체를 만들 수 있으므로 제작자에 해당합니다.특정 유형의 장난감(말 또는 자동차)을 제조하는 장난감 회사의 부서는 ConcreteCreator에 해당합니다.

공장 패턴 : 공장은 iProduct-implementations를 생성합니다

초록 공장 패턴 : 공장이 팩토리를 생산하여 IPERCTS를 생성합니다. :)

의견에 따라 업데이트
내가 이전에 쓴 것은 옳지 않습니다 위키 백과 적어도. 추상 공장은 단순히 공장 인터페이스입니다. 그것으로, 당신은 런타임에 공장을 전환하여 다른 맥락에서 다른 공장을 허용 할 수 있습니다. 예는 다른 OS'E, SQL 제공 업체, 미들웨어 드라이버 등의 다른 공장 일 수 있습니다.

추상 공장 패턴

  • 콘크리트 클래스를 지정하지 않고 관련 또는 종속 객체의 패밀리를 만들기위한 인터페이스를 제공하십시오.

  • 추상 공장 패턴은 공장 방법 패턴과 매우 유사합니다. 둘 사이의 한 가지 차이점은 추상 공장 패턴으로, 클래스는 구성을 통해 다른 객체에 대한 객체 인스턴스화의 책임을 위임하는 반면, 공장 방법 패턴은 상속을 사용하고 서브 클래스에 의존하여 원하는 객체 인스턴스화를 처리한다는 것입니다.

  • 실제로, 위임 된 객체는 종종 인스턴스화를 수행하기 위해 공장 방법을 사용합니다!

공장 패턴

  • 공장 패턴은 창조 패턴의 예입니다

  • 창조적 패턴은 객체 인스턴스턴스 프로세스를 추상화합니다. 그들은 객체가 만드는 방식을 숨기고 전체 시스템을 객체를 생성하고 구성하는 방식과 독립적으로 만들 수 있습니다.

  • 클래스 창조 패턴은 인스턴스화 공장 방법으로 결정하기 위해 상속을 사용하는 데 중점을 둡니다.

  • 객체 창조 패턴은 다른 물체 초록 공장에 대한 인스턴스화 대표에 초점

참조:공장 대 추상 공장

공장 방법 : 특정 기본 클래스에서 파생되는 객체를 만드는 공장이 있습니다.

초록 공장 : 당신은 생성하는 공장이 있습니다 다른 공장, 그리고이 공장은 차례로 기본 클래스에서 파생 된 물체를 만듭니다. 공장 방법과 마찬가지로 단일 객체 만 만들고 싶지 않기 때문에이 작업을 수행합니다. 오히려 관련 객체 모음을 만들고 싶습니다.

초록 공장은 관련 객체를 만드는 인터페이스이지만 공장 방법은 방법입니다. 초록 공장은 공장 방법에 의해 구현됩니다.

enter image description here

기본 차이 :

공장: 인스턴스화 로직을 클라이언트에 노출시키지 않고 객체를 만듭니다.

공장 방법: 객체 생성을위한 인터페이스를 정의하지만 서브 클래스가 인스턴스화 할 클래스를 결정하게하십시오. 공장 방법을 사용하면 클래스가 서브 클래스에 대한 인스턴스화를 연기 할 수 있습니다.

초록 공장: 콘크리트 클래스를 지정하지 않고 관련 또는 종속 객체 제품군을 만들기위한 인터페이스를 제공합니다.

추상적 패턴은 구성을 사용하여 다른 클래스에 객체를 만드는 책임을 위임하는 동안 공장 방법 패턴은 상속을 사용하고 파생 클래스 또는 하위 클래스에 의존하여 개체를 만듭니다.

에서 oolesign 조항:

공장 클래스 다이어그램 :

enter image description here

예 : 정적

 public class ShapeFactory {

   //use getShape method to get object of type shape 
   public static Shape getShape(String shapeType){
      if(shapeType == null){
         return null;
      }     
      if(shapeType.equalsIgnoreCase("CIRCLE")){
         return new Circle();

      } else if(shapeType.equalsIgnoreCase("RECTANGLE")){
         return new Rectangle();

      } else if(shapeType.equalsIgnoreCase("SQUARE")){
         return new Square();
      }

      return null;
   }
}

이 게시물에서는 비 정적 공장 공장 구현 공장 메드 예제를 사용할 수 있습니다.

디자인 패턴 : 공장 대 공장 방법 대 추상 공장

사용시기 : 클라이언트는 수업이 필요하며 어떤 구체적인 구현을 받고 있는지 신경 쓰지 않습니다.

공장 방법 클래스 Digaram :

enter image description here

사용시기 : 클라이언트는 런타임에 어떤 콘크리트 클래스를 만들어야하는지 알지 못하지만 작업을 수행 할 수업을 받기를 원합니다.

초록 공장 클래스 다이어그램 dzone

enter image description here

사용시기 : 시스템이 여러 제품군 제품군을 만들어야하거나 구현 세부 정보를 노출시키지 않고 제품 라이브러리를 제공하려는 경우.

위의 기사의 소스 코드 예제는 개념을 명확하게 이해하는 데 매우 좋습니다.

코드 예제와 관련된 관련 SE 질문 :

공장 패턴. 공장 방법을 언제 사용해야합니까?

차이점 :

  1. 초록 공장 수업은 종종 공장 방법으로 구현되지만 프로토 타입을 사용하여 구현할 수도 있습니다.
  2. 설계는 공장 방법 (덜 복잡하고 사용자 정의 가능, 서브 클래스 확산)을 사용하여 시작하고 더 많은 유연성이 필요한 다른 창조적 패턴 (더 유연하고 복잡한)으로 진화합니다.
  3. 공장 방법은 일반적으로 템플릿 방법 내에서 호출됩니다.

기타 유용한 기사 :

factory_method 사워 메이킹에서

Abstract_factory 사워 메이킹에서

추상-팩토리 디자인 패턴 JournalDev에서

추상 공장의 예/시나리오

나는 우기에 비가 오는 곳, 겨울에는 눈이 내리고 여름에는 뜨겁고 맑은 곳에 살고 있습니다. 요소로부터 자신을 보호하려면 다른 종류의 옷이 필요합니다. 그렇게하기 위해 나는 집 근처의 가게에 가서 자신을 보호하기 위해 옷/품목을 요청합니다. 가게 골키퍼는 주머니의 환경과 깊이에 따라 적절한 품목을 제공합니다. 그가 나에게주는 품목은 같은 수준의 품질과 가격대입니다. 그는 내 표준을 알고 있기 때문에 그렇게하기가 쉽습니다. 그러나 길 건너편의 부유 한 사람이 동일한 요구 사항을 제시하면 비싸고 브랜드 아이템을 얻습니다. 눈에 띄는 것은 그가 나에게주는 모든 항목이 품질, 표준 및 비용으로 서로를 보완한다는 것입니다. 그들은 서로와 함께 있다고 말할 수 있습니다. 이 부유 한 사람이 얻는 아이템도 마찬가지입니다.

위의 시나리오를 살펴보면 이제 상점 골키퍼의 효율성에 감사드립니다. 이 가게 주인을 추상 상점으로 교체 할 수 있습니다. 우리가 추상적 인 항목으로 얻는 항목과 저와 부자는 원근감 클라이언트입니다. 우리에게 필요한 것은 우리의 요구에 맞는 제품/품목입니다.

이제 수많은 고객에게 서비스 세트를 제공하는 온라인 상점을 고려하는 것을 쉽게 볼 수 있습니다. 각 클라이언트는 세 그룹 중 하나에 속합니다. 프리미엄 그룹 사용자가 사이트를 열면 훌륭한 UI, 고도로 사용자 정의 된 광고 창, 메뉴 등의 더 많은 옵션을 얻습니다.이 동일한 기능 세트는 금 사용자에게 제공되지만 메뉴의 기능은 적으며 광고는 대부분 관련이 있습니다. 그리고 약간 덜 egronomic ui. 마지막은 내 종류의 사용자, '무료 그룹'사용자입니다. 나는 불쾌감을 느끼지 않도록 충분히 봉사합니다. UI는 최소한의 최소입니다. 광고는 너무 많이 추적되므로 그 안에 들어있는 것이 무엇인지 알지 못합니다. 마지막으로 메뉴는 로그 아웃되었습니다.

이 웹 사이트와 같은 것을 만들 기회가 있다면 추상 공장 패턴을 확실히 고려할 것입니다.

초록 제품 : 광고 창, 메뉴, UI 화가.
초록 공장 : 웹 스토어 사용자 경험
Concreate Factory : 프리미엄 사용자 경험, 금 사용자 경험, 일반 사용자 경험.

많은 사람들이 놀랐을 것입니다. 그러나이 질문은 잘못된. 인터뷰 중에이 질문이 들리면 면접관이 혼란이 어디에 있는지 이해하도록 도와야합니다.

"공장"이라고 불리는 구체적인 패턴이 없다는 사실에서 시작합시다. "추상 공장"이라고 불리는 패턴이 있으며 "공장 방법"이라고하는 패턴이 있습니다.

그렇다면 "공장"은 무엇을 의미합니까? 다음 중 하나 (참조 범위에 따라 모두 정확한 것으로 간주 될 수 있음) :

  • 어떤 사람들은 그것을 별칭 (바로 가기)으로 사용합니다.초록 공장".
  • 어떤 사람들은 그것을 별칭 (바로 가기)으로 사용합니다.공장 방법".
  • 어떤 사람들은 그것을 모든 공장/창조적 패턴에 대해보다 일반적인 이름으로 사용합니다. 예를 들어 "초록 공장"과 "공장 방법"은 공장입니다.

그리고, 안타깝게도, 많은 사람들이 "공장"을 사용하여 공장이나 공장 (또는 인터페이스)을 만드는 다른 종류의 공장을 나타냅니다. 그들의 이론을 바탕으로 :

제품은 공장에서 생성되는 iProduct를 구현하며, 이는 Ifactory를 구현하며, 이는 추상적으로 생성됩니다.

이것이 얼마나 어리석은 지 이해하려면 우리의 방정식을 계속합시다.

AbstractFactory는 IABSTRANTFACTORY를 구현합니다.

요점이 보이길 바랍니다. 혼란스러워하지 말고 이유가없는 것을 발명하지 마십시오.

-

추신: 제품을위한 공장은 추상적이며 추상 공장을위한 공장은 추상적 인 공장의 또 다른 예일 것입니다.

//Abstract factory - Provides interface to create factory of related products
interface PizzaIngredientsFactory{    
   public Dough createDough(); //Will return you family of Dough
   public Clam createClam();   //Will return you family of Clam
   public Sauce createSauce(); //Will return you family of Sauce
}

class NYPizzaIngredientsFactory implements PizzaIngredientsFactory{

   @Override
   public Dough createDough(){
      //create the concrete dough instance that NY uses
      return doughInstance;
   }

   //override other methods
} 

교과서 정의는 이미 다른 답변에 의해 제공됩니다. 나는 그것의 예를 제공 할 것이라고 생각했다.

그래서 여기 PizzaIngredientsFactory 이다 초록 공장 관련 제품 제품군을 만들 수있는 방법을 제공합니다.

추상 공장의 각 방법은 공장 방법 그 자체로. 처럼 createDough() 그 자체로는 구체적인 구현이 서브 클래스로 제공 될 공장 방법입니다. NYPizzaIngredientsFactory. 따라서 각각의 다른 위치를 사용하면 위치에 속하는 콘크리트 성분의 인스턴스를 만들 수 있습니다.

공장 방법

콘크리트 구현 인스턴스를 제공합니다

예에서 :
- createDough() - 반죽에 대한 구체적인 구현을 제공합니다. 그래서 이것은 공장 방법입니다

초록 공장

관련 객체 제품군을 만들기위한 인터페이스를 제공합니다

예에서 :
- PizzaIngredientsFactory 관련 객체 세트를 만들 수있는 추상 공장입니다. Dough, Clams, Sauce. 각 물체 제품군을 만들기 위해 공장 방법을 제공합니다.

예제 첫 번째 디자인 패턴을 헤드하십시오

다음과 같이 John의 답변에 기여할 요점이 있습니다.

초록 공장은 공장 공장입니다!

"공장 방법"을 사용하면 ( "공장"만 모호하기 때문에) 구현을 생성합니다 (Lemon, Orange, 특정 인터페이스의 등. IFruit. 이 공장은 호출 될 수 있습니다 CitricFruitFactory.

그러나 이제 당신은 Citricfruitfactory가 만들 수없는 다른 종류의 과일을 만들고 싶습니다. 아마도 코드 일 수도 있습니다 CitricFruitFactory 당신이 당신을 만들면 말이되지 않을 것입니다 Strawberry 그 안에 (딸기는 시트릭 과일이 아닙니다!).

따라서 새로운 공장을 만들 수 있습니다 RedFruitFactory 그것은 생산합니다 Strawberry, Raspberry, 등.

John Feminella가 말했듯이 : "추상 공장 패턴을 사용하면 특정 공장 인터페이스 (예 : IFruitFactory. 각각은 다른 종류의 과일을 만드는 방법을 알고 있습니다. "

그 구현 IFruitFactory ~이다 CitricFruitFactory 그리고 RedFruitFactory!

내 출처는 다음과 같습니다. StackOverflow, tutorialspoint.com, programmers.stackexchange.com 그리고 CodeProject.com.


Factory Method (또한 호출 Factory)는 a의 디 쿠플 클라이언트를위한 것입니다 Interface 구현. 샘플의 경우 a Shape 두 가지와 인터페이스 Circle 그리고 Square 구현. 우리는 다음과 같은 결정자 매개 변수가있는 공장 메소드가있는 공장 클래스를 정의했습니다. Type 그리고 새로운 관련 구현 Shape 상호 작용.


Abstract Factory 여러 공장 구현에 의한 여러 공장 방법 또는 공장 인터페이스가 포함되어 있습니다. 위의 샘플의 경우 a Color 두 가지와 인터페이스 Red 그리고 Yellow 구현. 우리는 a를 정의했습니다 ShapeColorFactory 두 가지와 인터페이스 RedCircleFactory 그리고 YellowSquareFactory. 이 개념을 설명하기위한 다음 코드 :

interface ShapeColorFactory
{
    public Shape getShape();
    public Color getColor();
}

class RedCircleFactory implements ShapeColorFactory
{
    @Override
    public Shape getShape() {
        return new Circle();
    }

    @Override
    public Color getColor() {
        return new Red();
    }
}
class YellowSquareFactory implements ShapeColorFactory
{
    @Override
    public Shape getShape() {
        return new Square();
    }

    @Override
    public Color getColor() {
        return new Yellow();
    }
} 

여기서 차이 FactoryMethod 그리고 AbstractFactory. Factory Method 단순히 콘크리트 클래스의 인터페이스를 반환하지만 Abstract Factory 반품 factory of factory. 다시 말해 Abstract Factory 일련의 인터페이스의 다른 결합을 반환합니다.


내 설명이 유용하기를 바랍니다.

그 공장의 주요 차이점은 공장과 함께하고 싶은 공장과 그것을 사용하고 싶은시기입니다.

때로는 IOC를 수행 할 때 (제어의 반전, 즉 생성자 주입), 견고한 물체를 만들 수 있다는 것을 알고 있습니다. 과일의 위의 예에서 언급했듯이 과일의 물체를 만들 준비가되면 단순하게 사용할 수 있습니다. 공장 패턴.

그러나 여러 번, 당신은 견고한 객체를 만들고 싶지 않으며, 나중에 프로그램 흐름에서 올 것입니다. 그러나이 구성은 처음에 사용하려는 공장의 종류를 알려줍니다. 개체를 만드는 대신 공통 공장 클래스에서 IOC의 생성자로 파생 된 공장을 전달할 수 있습니다.

그래서 나는 또한 객체 수명과 창조에 관한 것이라고 생각합니다.

둘 다 Factory Method 그리고 Abstract Factory 클라이언트는 콘크리트 유형에서 분리 된 상태로 유지하십시오. 둘 다 객체를 만듭니다 Factory 방법은 상속을 사용합니다 Abstract Factory 구성을 사용하십시오.

그만큼 Factory Method 콘크리트 물체 (제품)를 생성하기 위해 서브 클래스로 상속됩니다. Abstract Factory 관련 제품 제품군 및 이러한 인터페이스의 서브 클래스를 만들기위한 인터페이스 제공 관련 제품을 만드는 방법을 정의하십시오.

그런 다음 인스턴스화 된이 서브 클래스는 추상 유형으로 사용되는 제품 클래스로 전달됩니다. An Abstract Factory 종종 사용을 구현합니다 Factory Method.

John Feminella 확장 답변 :

Apple, Banana, Cherry 구현 FruitFactory 그리고 그것은 이름이라는 방법이 있습니다 Create 사과 또는 바나나 또는 체리를 만드는 책임은 전적으로 책임이 있습니다. 당신은 당신과 함께 끝났습니다 Factory 방법.

자, 당신은 원합니다 Create 과일에서 특별한 샐러드가 있습니다. 초록 공장. 초록 공장은 사과, 바나나 및 체리에서 특별한 샐러드를 만드는 방법을 알고 있습니다.

public class Apple implements Fruit, FruitFactory {
    public Fruit Create() {
        // Apple creation logic goes here
    }
}

public class Banana implements Fruit, FruitFactory {
    public Fruit Create() {
        // Banana creation logic goes here
    }
}

public class Cherry implements Fruit, FruitFactory {
    public Fruit Create() {
        // Cherry creation logic goes here
    }
}

public class SpecialSalad implements Salad, SaladFactory {
    public static Salad Create(FruitFactory[] fruits) {
        // loop through the factory and create the fruits.
        // then you're ready to cut and slice your fruits 
        // to create your special salad.
    }
}

정의에 따라 우리는 두 가지의 차이점을 끌 수 있습니다.

공장 : 인터페이스는 객체를 만드는 데 사용되지만 서브 클래스는 어떤 클래스를 인스턴스화할지 결정합니다. 객체의 생성은 필요할 때 수행됩니다.

초록 공장 : 추상 공장 패턴은 다른 공장을 만드는 초고속 역할을합니다. 추상 공장 패턴에서 인터페이스는 콘크리트 클래스를 지정하지 않고 관련 객체 또는 종속 객체 세트를 작성해야합니다.

따라서 위의 정의에서 우리는 특정한 차이를 강조 할 수 있습니다. 즉, 공장 패턴은 객체를 만드는 책임이 있으며 추상 공장은 관련 객체 세트를 만드는 일을 담당합니다. 분명히 둘 다 인터페이스를 통해.

공장 패턴 :

public interface IFactory{
  void VehicleType(string n);
 }

 public class Scooter : IFactory{
  public void VehicleType(string n){
   Console.WriteLine("Vehicle type: " + n);
  }
 }

 public class Bike : IFactory{
  public void VehicleType(string n) {
  Console.WriteLine("Vehicle type: " + n);
  }
 }

 public interface IVehicleFactory{
  IFactory GetVehicleType(string Vehicle);
 }

 public class ConcreteVehicleFactory : IVehicleFactory{
 public IFactory GetVehicleType(string Vehicle){
   switch (Vehicle){
    case "Scooter":
     return new Scooter();
    case "Bike":
     return new Bike();
    default:
    return new Scooter();
  }
 }

 class Program{
  static void Main(string[] args){
   IVehicleFactory factory = new ConcreteVehicleFactory();
   IFactory scooter = factory.GetVehicleType("Scooter");
   scooter.VehicleType("Scooter");

   IFactory bike = factory.GetVehicleType("Bike");
   bike.VehicleType("Bike");

   Console.ReadKey();
 }
}

추상 공장 패턴 :

interface IVehicleFactory{
 IBike GetBike();
 IScooter GetScooter();
}

class HondaFactory : IVehicleFactory{
     public IBike GetBike(){
            return new FZS();
     }
     public IScooter GetScooter(){
            return new FZscooter();
     }
 }
class HeroFactory: IVehicleFactory{
      public IBike GetBike(){
            return new Pulsur();
     }
      public IScooter GetScooter(){
            return new PulsurScooter();
     }
}

interface IBike
    {
        string Name();
    }
interface IScooter
    {
        string Name();
    }

class FZS:IBike{
   public string Name(){
     return "FZS";
   }
}
class Pulsur:IBike{
   public string Name(){
     return "Pulsur";
   }
}

class FZscooter:IScooter {
  public string Name(){
     return "FZscooter";
   }
}

class PulsurScooter:IScooter{
  public string Name(){
     return "PulsurScooter";
   }
}

enum MANUFACTURERS
{
    HONDA,
    HERO
}

class VehicleTypeCheck{
        IBike bike;
        IScooter scooter;
        IVehicleFactory factory;
        MANUFACTURERS manu;

        public VehicleTypeCheck(MANUFACTURERS m){
            manu = m;
        }

        public void CheckProducts()
        {
            switch (manu){
                case MANUFACTURERS.HONDA:
                    factory = new HondaFactory();
                    break;
                case MANUFACTURERS.HERO:
                    factory = new HeroFactory();
                    break;
            }

      Console.WriteLine("Bike: " + factory.GetBike().Name() + "\nScooter: " +      factory.GetScooter().Name());
        }
  }

class Program
    {
        static void Main(string[] args)
        {
            VehicleTypeCheck chk = new VehicleTypeCheck(MANUFACTURERS.HONDA);
            chk.CheckProducts();

            chk= new VehicleTypeCheck(MANUFACTURERS.HERO);
            chk.CheckProducts();

            Console.Read();
        }
    }

여기에서 확인하십시오 : http://www.allapplabs.com/java_design_patterns/abstract_factory_pattern.htmFactory Method는 특정 클래스 (초록이 아닌)를 기본 클래스로 사용하는 것으로 보이며 Abstract Factory는이를 위해 추상 클래스를 사용합니다. 또한 초록 클래스 대신 인터페이스를 사용하는 경우 결과는 추상 공장 패턴의 다른 구현이됩니다.

:디

초록 공장은 다른 유형의 인터페이스를 생성하기위한 템플릿입니다. 수량, 가격 및 항목 별 정보가 포함 된 다양한 유형의 CSV 파일을 구문 분석 해야하는 프로젝트가 있다고 가정 해보자 초콜릿에 대한 과일 과일에 대한 데이터가 포함 된 다음 구문 분석 후 해당 데이터베이스 에서이 정보를 업데이트해야합니다. 파서와 수정 자 공장을 반환 한 추상 공장 중 하나를 반환 한 다음이 파서 공장은 초콜릿 파서 개체, 과일 파서 물체 등을 반환 할 수 있으며 유사하게 수정 자 공장은 초콜릿 수정 자체 개체, 과일 수정 자체 등을 반환 할 수 있습니다.

Java8 예제 코드를 보고이 두 가지의 차이점을 이해할 수 있다고 생각합니다.

  interface Something{}

  interface OneWhoCanProvideSomething {
     Something getSomething();
  }

  interface OneWhoCanProvideCreatorsOfSomething{
     OneWhoCanProvideSomething getCreator();
  }


public class AbstractFactoryExample {

    public static void main(String[] args) {
        //I need something
        //Let's create one
        Something something = new Something() {};

        //Or ask someone (FACTORY pattern)
        OneWhoCanProvideSomething oneWhoCanProvideSomethingOfTypeA = () -> null;
        OneWhoCanProvideSomething oneWhoCanProvideSomethingOfTypeB = () -> null;

        //Or ask someone who knows soemone who can create something (ABSTRACT FACTORY pattern)
        OneWhoCanProvideCreatorsOfSomething oneWhoCanProvideCreatorsOfSomething = () -> null;

        //Same thing, but you don't need to write you own interfaces
        Supplier<Something> supplierOfSomething = () -> null;
        Supplier<Supplier<Something>> supplierOfSupplier = () -> null;
    }

}

이제 문제는 어떤 창조 방식을 사용해야하는지, 왜 다음과 같은 이유입니다 : 첫 번째 방법 (패턴 없음, 단지 일반 생성자) : 혼자서 창조하는 것이 좋지 않습니다. 모든 작업을 수행해야하며 클라이언트 코드가 연결되어 있습니다. 특정 구현.

두 번째 방법 (공장 패턴 사용) : 모든 유형의 구현을 통과 할 수 있다는 이점을 제공하며, 이는 일부 조건 (창조적 방법으로 전달 된 매개 변수)에 따라 다른 유형의 무언가를 제공 할 수 있습니다.

세 번째 방법 (추상 공장 패턴 사용) : 이것은 더 많은 유연성을 제공합니다. 일부 조건에 따라 다른 유형의 제작자를 찾을 수 있습니다 (아마도 매개 변수가 전달 될 수 있음).

두 가지 조건을 결합하여 (코드 복잡성과 커플 링을 약간 증가시켜) 공장 패턴으로 항상 벗어날 수 있습니다. 그래서 우리는 추상 공장 패턴의 실제 사용 사례를 거의 볼 수없는 이유라고 생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top