나는 웹사이트에서 디자인 패턴을 읽고 있었다.
거기서 Factory, Factory method, Abstract factory에 대해 읽었는데 너무 헷갈려서 정의가 명확하지 않습니다. 정의에 따르면
공장 - 인스턴스화 논리를 클라이언트에 노출하지 않고 객체를 만들고 공통 인터페이스를 통해 새로 생성된 객체를 참조합니다. Factory Method의 단순화된 버전인지 여부
Factory Method - 객체를 작성하기 위한 인터페이스를 정의하지만 하위 클래스가 인스턴스화할 클래스를 결정하도록 허용하고 공통 인터페이스를 통해 새로 작성된 객체를 참조합니다.
Abstract Factory - 클래스를 명시적으로 지정하지 않고 관련 개체 패밀리를 만들 수 있는 인터페이스를 제공합니다.
Abstract Factory vs Factory Method에 관한 다른 스택 오버플로 스레드도 살펴보았지만, 거기에 그려진 UML 도표는 나의 이해를 더욱 나쁘게 합니다.
아무나 나에게 말해줄래?
세 가지 공장 유형 모두 동일한 작업을 수행합니다. 그들은 똑똑한 건설업자입니다.
여러분이 사과와 오렌지 두 종류의 과일을 만들 수 있기를 원한다고 해 봅시다.
class FruitFactory {
public Apple makeApple() {
// Code for creating an Apple here.
}
public Orange makeOrange() {
// Code for creating an orange here.
}
}
사용 사례: Apple 또는 Orange를 구성하는 것은 생성자에서 다루기에는 너무 복잡합니다.
abstract class FruitPicker {
protected abstract Fruit makeFruit();
public void pickFruit() {
private final Fruit f = makeFruit(); // The fruit we will work on..
<bla bla bla>
}
}
...그런 다음 하위 클래스에서 공장 메서드를 구현하여 "FruitPicker.pickFruit()"의 공통 기능을 다시 사용할 수 있습니다.
class OrangePicker extends FruitPicker {
@Override
protected Fruit makeFruit() {
return new Orange();
}
}
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();
}
}
>, 1. 이 세 가지 패턴을 서로 다르다는 어때?
Factory:* tcpg 객체에는 logic 를 표시하는 인스턴스 없이 클라이언트뿐.
Let 이 하위 클래스 객체 생성 인터페이스입니다 Method:* 팩터리의 정의하십시오 있지만 인스턴스화합니다 클래스를 결정합니다. 팩토리 메서드 하위 클래스 인스턴스 지연합니다 할 수 있습니다.
추상 Factory:* 인터페이스입니다 가족 만들기 위한 구체적인 입장을 관련 또는 종속적입니다 객체에는 클래스뿐만 지정하지 않고 있습니다.
>. 2. 사용할 때 어떤?
Factory:* 클라이언트입니다 가져오는 것은 어떤 구체적인 구현 클래스를 신경을 쓰지 않습니다 있으면 됩니다.
팩터리의 Method:* 클라이언트입니다 doesn& # 39, 콘크리트 t know what it 적립율은 런타임에 클래스를 만드는 데 필요한 작업을 수행할 수 있도록 한 것이 아니라, 클래스 될 것이다.
AbstactFactory:* 시스템에 여러 개 만들 때 가족 없이 제품 또는 제품의 라리브러리 허용할 것을 세부 구현.
추상 팩토리 클래스뿐만 Factory Method 로 구현된 경우가 많습니다. 일반적으로 공장 내에 불렀으매 메서드을 템플리트를 방법.
>, 3. 또한 가능하면 관련된 모든 자바 참조용이므로 이러한 패턴은?
공장 및 파스토리메트로트 *
Intent:*
정의하십시오 객체를 생성하기 위한 인터페이스입니다 서브노드 클래스뿐만 인스턴스화합니다 과연 그럴까? 클래스를 결정합니다. Factory Method 를 하위 클래스 인스턴스 지연합니다 클래스용 수도 있습니다.
It eventtest Product:* 객체의 인터페이스입니다 출하시의 만들어집니다.
ConcreteProduct:* 제품 인터페이스를 구현합니다.
Creator:* 출하시의 메서드로부터 선언합니다.
ConcreateCreator:* Factory method 는 반환되기를 오버클로킹된 인스턴스입니다 콘크레티프로더스
과제: 이 게임은 게임 만드는 방법을 사용하여 정의하는 팩터리의 팩터리의 인터페이스입니다.
코드 스니핏:
비교가 창조적 패턴:
참조입니다 자세한 판독값: 수르스마킹 디자인 패턴
Factory - Factory 클래스를 분리하여 복잡한 개체를 만듭니다.
예: 과일 오브젝트를 만들기 위한 과일 공장 클래스
class FruitFactory{
public static Fruit getFruit(){...}
}
공장 방법-공장에 대한 전체 개별 클래스 대신 해당 클래스 자체에 하나의 방법을 공장으로 추가합니다.
예:
Calendar.getInstance() (Java's Calendar)
공장소개방법 -공장소개
예: 컴퓨터 부품을 위한 공장을 짓고 싶다고 합시다. 그래서 노트북, 데스크탑, 서버와 같은 여러 종류의 컴퓨터가 있다.
따라서 각 컴퓨터 유형별로 공장이 필요합니다. 그래서 우리는 아래와 같은 높은 수준의 공장을 하나 만든다.
ComputerTypeAbstractFactory.getComputerPartFactory(String computerType) ---> This will return PartFactory which can be one of these ServerPartFactory, LaptopPartFactory, DesktopPartFactory.
이제 이 3개 자체가 다시 공장입니다. (PartFactory 자체를 다루게 되지만, 추상 공장에서 제공한 내용에 따라 별도로 구현됩니다.)
Interface-> PartFactory. getComputerPart(String s),
Implementations -> ServerPartFactory, LaptopPartFactory, DesktopPartFactory.
Usage:
new ComputerTypeAbstractFactory().getFactory(“Laptop”).getComputerPart(“RAM”)
EDIT: 주석의 이의에 따라 Abstract Factory에 대한 정확한 인터페이스를 제공하도록 편집되었습니다.
모든 디자인 패턴은 작성된 작업 코드를 건드리지 않도록 하는 데 도움이 됩니다. 일단 작업 코드를 터치하면 기존 작업 흐름에 결함이 있으며, 고장나지 않았는지 확인하기 위해 훨씬 더 많은 테스트를 수행해야 한다는 것을 우리는 모두 알고 있습니다.
공장 패턴은 입력 기준에 따라 객체를 생성하므로 코드를 작성할 필요가 없습니다. 만약 이것이 이러한 객체를 생성한다면 이와 같은 종류의 객체를 생성할 수 있습니다. 이것의 좋은 예는 여행 웹사이트이다. 여행 웹사이트는 여행(비행기, 기차, 버스) 또는/또는 호텔 또는/관광지 패키지를 제공할 수 있습니다. 이제 사용자가 다음을 선택할 때 웹 사이트는 생성해야 하는 개체를 결정해야 합니다. 여행이나 호텔 오브젝트만 생성해야 합니까?
만약 여러분이 포트폴리오에 다른 웹사이트를 추가하는 것을 상상한다면, 예를 들어 카풀 웹사이트와 같은 핵심이 사용된다고 생각한다면, 여러분은 핵심에 추상적인 공장을 사용할 수 있습니다. 이렇게 하면 택시와 카풀 공장을 하나 더 열 수 있습니다.
두 공장 모두 서로 무관하므로 서로 다른 공장에 보관하는 것이 좋습니다.
이제 분명해지길 바래. 이 예시를 염두에 두고 웹사이트를 다시 공부하세요. 도움이 되길 바랍니다. 그리고 나는 정말로 내가 패턴을 정확하게 표현했기를 바란다:)
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, 압스트라치프로두스트브 압스트라치프로두스타 객체를 생성할 수
이를 위해 이, 야, 내가 " Four" 의 강 () 는 다음과 같은 뜻이 있다. 책.
없음 , " Factory" 있습니다. 간단한 Factory" 아니하고또 "; 가상 Factory" 아니하고또 "; 이 책에서 redefinitions. , 표시는 보통 사람들이 " Factory" 대해 얘기하고 있다. 생각하신거야 특정 클래스의 객체 생성 패턴 이야기할 수 있을 (서피스뿐 아니라 " builder"; 패턴). 그들은 , 자세한 내용은 " Method" 팩터리의 않을 수도 있다. 추상 또는 " Factory"; 으로 나타낼 수 있다. 누구나 " 구현하십시오 Factory"; # 39, t, s not a # 39 it& won& 속박하였으니 그가 때문에 공식적인 용어 (가질 수 있다는 것을 명심해야 일부 people\companies\communities 자신의 어휘).
이 책은 , 만 추상적인 Factory" " 대한 정의가 포함되어 있습니다. 그리고 Method" 팩터리의 ";).
다음은 redefinitions) 의 책 그리고 짧은 설명을 모두 이유를 정말 혼란스럽다. 내가 코드 예제를 생략하십시오 것들이었다고요 수 있기 때문에 다른 대답:
팩터리의 방법 (고프) *: 하지만 이제 하위 클래스 객체 생성 인터페이스입니다 정의하십시오 인스턴스화합니다 클래스를 결정합니다. Factory Method 를 하위 클래스 인스턴스 지연합니다 수도 있습니다.
추상 팩토리 (고프) *: 가족 또는 종속적입니다 객체에는 인터페이스입니다 제공하십시오 만들기 위한 구체적인 입장을 지정하지 않고 관련 클래스뿐만.
출처 혼란이 끊이질 : 자주 사용되는, 하나의 클래스를 " Method" 팩터리의 호출할 수 있습니다. 패턴 등 Factory" ";). 이 클래스는 추상 정의에 의해. # 39 에 왜 이 추상 클래스, 쉽게 that& 호출하십시오 " Factory". 하지만 그냥 it& # 39, s 클래스의 이름을. # 39, t, 추상 Factory" 함께 이 " shouldn& 줄 수 있습니다. 패턴 (클래스 이름! = 패턴 이름). 이 추상 Factory" "; , * 추상 클래스를 사용하여 패턴이 않니다 것은 다릅니다. it eventtest 인터페이스입니다 (프로그래밍 언어 인터페이스입니다 아니다) 또는 오브젝트를 생성하기 위해 더 큰 부분을 서로 관련된 특정한 방식으로 만들어야 합니다.
아무도 말을 인용해 당초 책 [ 디자인 패턴: 어떤 답을 얻을 수 있는 객체 지향 소프트웨어 요소 (] (https://www.amazon.com/Design-Patterns-Object-Oriented-Addison-Wesley-Professional-ebook/dp/B000SEIBB8), 처음 두 단락으로 단면 "토론 창조적 패턴" (강조 내거냐):
>. 공통적으로 두 가지 방법을 통해 객체 클래스는 시스템 매개 변수화 만들어집니다. , 객체를 생성하는 하위 클래스 한 방법은 팩토리 메서드 패턴 (107) 이 사용하는 해당합니다. (주) 이 필요한 것일 수 있다는 단점이 외곽진입 새로운 하위 클래스 변경하십시오 제품. 이런 변화가 케스케이드 수 있습니다. 예를 들어, 이 제품을 만든 후, 당신은 그 자체가 작성자여야 factory method 무시하려면 작성자여야 잘 알려져 있다.
>. 시스템 는 다른 방법을 자세히 객체에는 매개 변수화 컴포지션에 : 그게 클래스를 정의하는 객체에는 아심과 담당하는 it 제품의 매개변수입니다 오브젝트에도 저회가 시스템. 이것은 중요한 측면은 추상 팩토리 패턴 (87), 구성기는 (97), 및 원형 (117). 모든 제품 객체를 생성하는 것이 그 책임을 3 mediaagent 생성하기에 새로운밒 팩터리의 객체에는 ". 추상 팩토리 출하시의 객체에는 여러 클래스뿐만 객체에는 생산하고 있다. 복잡한 프로토콜을 사용하여 복잡한 제품 구축 구성기에는 출하시의 객체에는 변동분 대응. 프로토타입 제품 프로토타입 객체는 객체를 복사하는 방식으로 구축되므로 출하시의 있다. 이 경우 출하시의 객체와 객체, 프로토타입 원형 (prototype) 은 동일한 때문에 책임이 있는 것입니다.