Just_another_developer
그는 물었다 8년 전
164

디자인 패턴: 팩터리의 vs Factory method 와 추상 팩토리

I was 판독값 웹사이트에서 디자인 패턴

팩토리 메서드 및 추상 팩토리, 그들은 그곳에서 나는 검토완료 팩터리의 너무 많다고, am not 대한 명확한 정의를. 정의를 따르면

&gt. Tcpg 객체에는 팩터리의 클라이언트뿐 logic 를 표시하는 인스턴스 없이 공통 인터페이스를 통해 새로 만들어진 객체에는 것을 의미한다. Factory Method 는 간편화된 버전니다.

&gt. 팩토리 메서드 - eventtest 인터페이스입니다 하위 클래스 인스턴스화합니다 결정할 수 있지만, 객체를 생성하기 위해 새로 만들어진 공통 인터페이스를 통해 객체에는 것을 의미한다.

&gt. 추상 팩토리 - 제공사항 인터페이스입니다 가족 만들기 위한 관련 없이 오브젝트에도 명시적으로 specifying 기다리고 있다.

난 또 다른 모습을 그린 UML 다이어그램을 스택 오버플로 스래드입니다 추상 팩토리 vs Factory Method 하지만 저의 대한 이해를 더욱 악화시키고 있습니다.

아무나 알려주세요

  1. 이 세 가지 패턴을 서로 다르다는 어때?
  2. 사용할 때 어떤?
  3. 또한 가능하면 관련된 모든 자바 참조용이므로 이러한 패턴은?
Nick Alexeev
그는 5년 전 댓글을 달았습니다
2

내가 어렸을 때 거의 같은 질문에 답을 찾는 동안 O. P., I found (영문: [아니요 에서 공장 팩터리의 방법] (http://www.codeproject.com/Articles/492900/From-No-Factory-to-Factory-Method). 이 제품은 발전에 따라 분석 샘플 프로젝트 (이 제목은 진화 단계를 하나로 언급한 factory method).

답변 7 개

3 개 공장 유형은상위 모든 못하며창조된 마찬가지입니다. 그들은 &quot, 스마트 constructor".

39 의 말하도다 let& 원하는걸까요 두 종류의 생산하시니 만들 수 있습니다. 애플, 오렌지.

&lt h3&gt Factory&lt /h3>;;; 방금 하나 없이,,) 는 &quot 팩터리의 fixed&quot 구축현 의 하위 클래스화. 이 경우에는 다음과 같은 클래스

class FruitFactory {

  public Apple makeApple() {
    // Code for creating an Apple here.
  }

  public Orange makeOrange() {
    // Code for creating an orange here.
  }

}

览侩 荤례: 사과 (isp) 가 처리할 수 있는 구성으로 구성자를 호스트였든 오랜지와 조금 너무 복잡합니다.

&lt h3&gt Method&lt 팩터리의 /h3>;;; 팩터리의 있을 때 일반적으로 사용되는 방식은 다를 수 있지만, 일부 일반 처리 클래스에서 어떤 종류의 생산하시니 스맥랜드의 실제로 사용할 수 있습니다. 그래서:

abstract class FruitPicker {

  protected abstract Fruit makeFruit();

  public void pickFruit() {
    private final Fruit f = makeFruit(); // The fruit we will work on..
    <bla bla bla>
  }
}

다시 사용할 수 있습니다 () '에서' 프라이트피커.픽프루이트 .즉 공통 기능을 구현하여 factory method 의 하위 클래스:

class OrangePicker extends FruitPicker {

  @Override
  protected Fruit makeFruit() {
    return new Orange();
  }
}

&lt h3&gt, 추상 Factory&lt /h3>;; 추상 팩토리 같은 때 일반적으로 사용되는 의존성 주입 / 전략, 원하는걸까요 만들 수 있도록 하는 객체의 &quot kind&quot, 온 가족이 있고, 같은 몇 가지 일반적인 기본 클래스. S # 39, here& 생기기 과일 관련 예. 우리는 우리가 원하는 것을 확인할 수 있도록 # 39 는 览侩 荤례 슬라이드에서는 don& 사용, t 실수로 로랑주피커 협력하였습니다 애플. 우리 한 것 같은 팩터리의 생산하시니 및 선택기를 http://support. we get 에서 match).

interface PlantFactory {

  Plant makePlant();

  Picker makePicker(); 

}

public class AppleFactory implements PlantFactory {
  Plant makePlant() {
    return new Apple();
  }

  Picker makePicker() {
    return new ApplePicker();
  }
}

public class OrangeFactory implements PlantFactory {
  Plant makePlant() {
    return new Orange();
  }

  Picker makePicker() {
    return new OrangePicker();
  }
}

jaco0646
croraf
그는 7년 전 댓글을 달았습니다
8

이러한 패턴은 모두 이해할 수 있는 내 가장 +1 이 이 답이다. 예제 코드 (클라이언트) 추가 호출하십시오 데도 도움이 된다? 나를 귀찮게 하는 질문을 할 수 있다. 우리가 말할 수 있는 것은 그저 팩터리의 추상 팩토리 패턴 ehas 팩토리 메서드 패턴 (# 39 m 선택해제합니다 I& 이 말이 사실이라면, 이 주제에 대해)?

Taztingo
그는 4년 전 댓글을 달았습니다
7

이것은 예제에서와 I& # 39 년 찾고, ve 보냈다.

&gt, 1. 이 세 가지 패턴을 서로 다르다는 어때?

  • Factory:* tcpg 객체에는 logic 를 표시하는 인스턴스 없이 클라이언트뿐.

  • Let 이 하위 클래스 객체 생성 인터페이스입니다 Method:* 팩터리의 정의하십시오 있지만 인스턴스화합니다 클래스를 결정합니다. 팩토리 메서드 하위 클래스 인스턴스 지연합니다 할 수 있습니다.

  • 추상 Factory:* 인터페이스입니다 가족 만들기 위한 구체적인 입장을 관련 또는 종속적입니다 객체에는 클래스뿐만 지정하지 않고 있습니다.

      • 객체 생성 패턴 /dev/raw/raw1 위임합니다 압스트라스파스토리 컴포지션에 책임을 다른 클래스 상속 및 파생 클래스 팩토리 메서드 패턴 의존 동안 설계 또는 하위 클래스를 사용하여 객체를 생성할 수 *

&gt. 2. 사용할 때 어떤?

  • Factory:* 클라이언트입니다 가져오는 것은 어떤 구체적인 구현 클래스를 신경을 쓰지 않습니다 있으면 됩니다.

  • 팩터리의 Method:* 클라이언트입니다 doesn& # 39, 콘크리트 t know what it 적립율은 런타임에 클래스를 만드는 데 필요한 작업을 수행할 수 있도록 한 것이 아니라, 클래스 될 것이다.

  • AbstactFactory:* 시스템에 여러 개 만들 때 가족 없이 제품 또는 제품의 라리브러리 허용할 것을 세부 구현.

추상 팩토리 클래스뿐만 Factory Method 로 구현된 경우가 많습니다. 일반적으로 공장 내에 불렀으매 메서드을 템플리트를 방법.

&gt, 3. 또한 가능하면 관련된 모든 자바 참조용이므로 이러한 패턴은?

  • 공장 및 파스토리메트로트 *

  • Intent:*

정의하십시오 객체를 생성하기 위한 인터페이스입니다 서브노드 클래스뿐만 인스턴스화합니다 과연 그럴까? 클래스를 결정합니다. Factory Method 를 하위 클래스 인스턴스 지연합니다 클래스용 수도 있습니다.

UML 다이어그램의:

! [입력하십시오. 이미지 여기에 설명을] [2]

  • It eventtest Product:* 객체의 인터페이스입니다 출하시의 만들어집니다.

  • ConcreteProduct:* 제품 인터페이스를 구현합니다.

  • Creator:* 출하시의 메서드로부터 선언합니다.

  • ConcreateCreator:* Factory method 는 반환되기를 오버클로킹된 인스턴스입니다 콘크레티프로더스

과제: 이 게임은 게임 만드는 방법을 사용하여 정의하는 팩터리의 팩터리의 인터페이스입니다.

코드 스니핏:

35857241 https://stackoverflow.com/questions/69849/factory-pattern-when-to-use-factory-methods/35857241

비교가 창조적 패턴:

  1. Factory Method 를 사용하여 설계 처음에는 (덜 복잡한, 더 많은 커스터마이징됩니다 산재, 하위 클래스) 을 향해 발전시키십시오 추상 팩토리, 원형 (prototype), 또는 구성기는 (보다 유연한, 더 복잡한) 로 검색 좀 더 유연한 요구되는가 있는 디자이너
        • 클래스는 추상 팩토리 2., 강가와 사용해 구현할 수 있는 방법을 자주 구현됩니까 팩터리의 프로토타입

참조입니다 자세한 판독값: 수르스마킹 디자인 패턴

Ravindra babu
Tony Lin
그는 3년 전 댓글을 달았습니다
0

Factory Method 를 정의할 수 있으며, t, shouldn& # 39 수퍼?

      • 팩터리의 별도의 팩터리의 클래스용 복잡한 객체에는 만들 수 있습니다.

예: 프라이트 파스토리 클래스용 생산하시니 객체를 생성할 수 있다.

class FruitFactory{

public static Fruit getFruit(){...}

}

      • 대신 별도의 클래스 팩토리 메서드 위한 방법 중 하나는 이 클래스 팩토리, 전체 추가하기만 자신을 팩터리의.

예:

Calendar.getInstance() (Java's Calendar)

추상 팩토리 메서드 공장 팩터리의 -

예: 컴퓨터 부품의 비헤이비어는 말하도다 구축하십시오 팩터리의 싶다. 그래서 노트북, 데스크톱, 서버 등 여러 가지 형태의 컴퓨터.

그래서 각 유형에 대한 comp터 팩터리의 필요하다. 그래서 우리는 아래와 같은 높은 레벨 팩터리의 생성하시겠습니까 공장

ComputerTypeAbstractFactory.getComputerPartFactory(String computerType) ---> This will return PartFactory which can be one of these ServerPartFactory, LaptopPartFactory, DesktopPartFactory.

이제 다시 자체도 이들 3 공장. (You will be 다루는 파르파스토리 자체가 아니라, 후드 아래에 있을 수 있는 별도의 구축현 제공한 것을 바탕으로 추상 팩토리)

  Interface-> PartFactory. getComputerPart(String s), 
Implementations -> ServerPartFactory, LaptopPartFactory, DesktopPartFactory.

Usage:
new ComputerTypeAbstractFactory().getFactory(“Laptop”).getComputerPart(“RAM”)

편집: 추상 팩토리 대한 정확한 인터페이스를 제공하기 위해 편집됩니다 따라 이의 의견.

Ravi K
xtofl
그는 8년 전 댓글을 달았습니다
0

'개념은' comp터파스토리 약간만이라도 있는 경우 일반적인 생성 인터페이스입니다 ('게츠린 (); 제키부아르 (); 제디스카드리브 (); 때 아닌 컴퓨터 유형을 제안하세요 호스트당 인터페이스입니다. '). 디자인 문제 같은 단어 두 차례 사용하면 냄새를 맡을 수 있어요 같은 기술서임을: LaptopFactory.getLaptopPar * ().

Ravi K
그는 8년 전 댓글을 달았습니다
0

아니, 아니, 정확히 코드에 대한 don& # 39, 가지 않을 수 없다. 그냥 오버클로킹된 안올로기 이해를 위해. 정확한 스케쳐내 예와 함께 인터페이스와도 도착했군요.

안내선:

인터페이스입니다 &gt -; Comp터파르트, 구현 - &gt. RAM, HDD, 프로세서

팩터리의:

Interface-&gt. 파르파스토리. 제콤프터파르트 (문자열 s) &Gt 구축 -; 세르베르파르파스토리, 라파토파스파스토리, 데스카토파스파스토리.

추상 팩토리: Comp터티페이제파르파스토리 ("문자열 s")

사용법: 새로운 comp터티페 그제파스토리 그제콤프터파르트 ("ramcomment") () ("노트북")

Ravi K
그는 8년 전 댓글을 달았습니다
1

내가 답을 업데이트했는지 잘있게나 대한 우려가 제기되고 있다. 추상 팩토리 아니다 하지만 실제로 파스토리 공장 뿐입니다. 앞서 예를 딱 내가 준 참조서 (가정) 가 동시에 판독기에서 잘있게나 인터페이스를 실제 구현). 여전히 알려 주셔서 감사합니다. 항상 좋은 높일 수 있다. )

Julien__
그는 4년 전 댓글을 달았습니다
0

추상 팩토리 'no' 공장 팩터리의 아닙니다. # 39 추상 클래스 ',' s an it& 호스트였든 사용할 수 있는 구체적인 객체를 생성할 수 있는 '' 인터페이스입니다 구현됩니까 / ehas 다른 공장. 코드 참조 수락됨 문제에 대한 정보. 그리고 제발 제거 또는 그에 따라 오토메이티드 변경하십시오.

이 숨쉬는 모든 코드를 가질 수 있도록 디자인 패턴, apc® 기록되었으므로 아니다. 우리 모두가 알고 있는 우리는 일단 터치 apc® 코드 몇 가지 결함을 흐름 등 많은 테스트를 받을 수 있도록 하는 기존 apc® 수행됨 분할합니다 아무것도 없었습니다.

A 는 입력 기준에 따라 객체에는 팩토리 패턴 때문에 이 같은 코드를 작성할 필요가 있으면 만들 수 있는지 좀 객체에는 이 좀 다른 않습니다 그런 객체에는. 웹 사이트 () 는 여행 좋은 예입니다. 여행 (비행기, 기차, 버스) 또는 웹 사이트를 통해 여행 디렉토리에만 제공하십시오 호텔 / 또는 / 제공하십시오 관광지 쉽다. 이제 사용자가 결정할 때, 그 다음, 웹 사이트를 객체에는 만들 수 있어야 합니다. 너무 여행이나 호텔 객체에는 만듭다 할 뿐입니다.

이제 다른 웹 사이트를 추가할 경우 envision 데이터베이스에구성원을 포트폴리오, 당신이 믿는 똑같이 사용할 수 있는 핵심, 예를 들어, 웹 사이트 검색을 하면 이제 # 39 의 카풀 cab& 지불액 온라인 기업의 핵심 요약 공장에서 사용할 수 있습니다. 이렇게 한 더 이상 공장 및 카풀 스냅되지 됩니다.

39 의 factory& 모두 아무런 관련이 있기 때문에 좋은 디자인이 서로 다른 이들을 factory& # 39 을 유지할 수 있다.

이제 ᄋ "이번 분명하다. 이 예에서는 염두에 두고 다시 공부를 잘하면 웹 사이트를 유지하는 데 도움이 될 것이라고 말했다. 정말이지 나는 내가 제대로 패턴을 나타내는:).

이를 위해 이, 야, 내가 &quot Four&quot 의 강 () 는 다음과 같은 뜻이 있다. 책.

없음 , &quot Factory&quot 있습니다. 간단한 Factory&quot 아니하고또 "; 가상 Factory&quot 아니하고또 "; 이 책에서 redefinitions. , 표시는 보통 사람들이 &quot Factory&quot 대해 얘기하고 있다. 생각하신거야 특정 클래스의 객체 생성 패턴 이야기할 수 있을 (서피스뿐 아니라 &quot builder"; 패턴). 그들은 , 자세한 내용은 &quot Method&quot 팩터리의 않을 수도 있다. 추상 또는 &quot Factory"; 으로 나타낼 수 있다. 누구나 &quot 구현하십시오 Factory"; # 39, t, s not a # 39 it& won& 속박하였으니 그가 때문에 공식적인 용어 (가질 수 있다는 것을 명심해야 일부 people\companies\communities 자신의 어휘).

이 책은 , 만 추상적인 Factory&quot &quot 대한 정의가 포함되어 있습니다. 그리고 Method&quot 팩터리의 ";).

다음은 redefinitions) 의 책 그리고 짧은 설명을 모두 이유를 정말 혼란스럽다. 내가 코드 예제를 생략하십시오 것들이었다고요 수 있기 때문에 다른 대답:

  • 팩터리의 방법 (고프) *: 하지만 이제 하위 클래스 객체 생성 인터페이스입니다 정의하십시오 인스턴스화합니다 클래스를 결정합니다. Factory Method 를 하위 클래스 인스턴스 지연합니다 수도 있습니다.

  • 추상 팩토리 (고프) *: 가족 또는 종속적입니다 객체에는 인터페이스입니다 제공하십시오 만들기 위한 구체적인 입장을 지정하지 않고 관련 클래스뿐만.

  • 출처 혼란이 끊이질 : 자주 사용되는, 하나의 클래스를 &quot Method&quot 팩터리의 호출할 수 있습니다. 패턴 등 Factory&quot ";). 이 클래스는 추상 정의에 의해. # 39 에 왜 이 추상 클래스, 쉽게 that& 호출하십시오 &quot Factory". 하지만 그냥 it& # 39, s 클래스의 이름을. # 39, t, 추상 Factory&quot 함께 이 &quot shouldn& 줄 수 있습니다. 패턴 (클래스 이름! = 패턴 이름). 이 추상 Factory&quot "; , * 추상 클래스를 사용하여 패턴이 않니다 것은 다릅니다. it eventtest 인터페이스입니다 (프로그래밍 언어 인터페이스입니다 아니다) 또는 오브젝트를 생성하기 위해 더 큰 부분을 서로 관련된 특정한 방식으로 만들어야 합니다.

AbstractProductA, A1 and A2 both implementing the AbstractProductA
AbstractProductB, B1 and B2 both implementing the AbstractProductB

interface Factory {
    AbstractProductA getProductA(); //Factory Method - generate A1/A2
}
Factory Method 를 사용하여 만들 수 있게 A1, A2) 의 압스트라치프로두스타 또는 수 있습니다.

interface AbstractFactory {
    AbstractProductA getProductA(); //Factory Method
    AbstractProductB getProductB(); //Factory Method
}

하지만 1 개 이상 두는 추상 팩토리 팩터리의 방법 (예: 이러한 일련의 객체에는 메서드을 2 공장) 을 팩터리의 방법 / 관련 객체까지 생깁니다. 추상 팩토리 사용하여, 사용자는 A1, B1, 압스트라치프로두스트브 압스트라치프로두스타 객체를 생성할 수

아무도 말을 인용해 당초 책 [ 디자인 패턴: 어떤 답을 얻을 수 있는 객체 지향 소프트웨어 요소 (] (https://www.amazon.com/Design-Patterns-Object-Oriented-Addison-Wesley-Professional-ebook/dp/B000SEIBB8), 처음 두 단락으로 단면 "토론 창조적 패턴" (강조 내거냐):

&gt. 공통적으로 두 가지 방법을 통해 객체 클래스는 시스템 매개 변수화 만들어집니다. , 객체를 생성하는 하위 클래스 한 방법은 팩토리 메서드 패턴 (107) 이 사용하는 해당합니다. (주) 이 필요한 것일 수 있다는 단점이 외곽진입 새로운 하위 클래스 변경하십시오 제품. 이런 변화가 케스케이드 수 있습니다. 예를 들어, 이 제품을 만든 후, 당신은 그 자체가 작성자여야 factory method 무시하려면 작성자여야 잘 알려져 있다.

&gt. 시스템 는 다른 방법을 자세히 객체에는 매개 변수화 컴포지션에 : 그게 클래스를 정의하는 객체에는 아심과 담당하는 it 제품의 매개변수입니다 오브젝트에도 저회가 시스템. 이것은 중요한 측면은 추상 팩토리 패턴 (87), 구성기는 (97), 및 원형 (117). 모든 제품 객체를 생성하는 것이 그 책임을 3 mediaagent 생성하기에 새로운밒 팩터리의 객체에는 ". 추상 팩토리 출하시의 객체에는 여러 클래스뿐만 객체에는 생산하고 있다. 복잡한 프로토콜을 사용하여 복잡한 제품 구축 구성기에는 출하시의 객체에는 변동분 대응. 프로토타입 제품 프로토타입 객체는 객체를 복사하는 방식으로 구축되므로 출하시의 있다. 이 경우 출하시의 객체와 객체, 프로토타입 원형 (prototype) 은 동일한 때문에 책임이 있는 것입니다.