> Java > java지도 시간 > 본문

Java 세 가지 팩토리 모드

高洛峰
풀어 주다: 2016-12-15 13:54:32
원래의
1300명이 탐색했습니다.

적용 가능한 경우:
7.3 팩토리 패턴의 적용 가능한 경우

새로운 객체를 생성하는 가장 쉬운 방법은 new 키워드와 구체적인 클래스를 사용하는 것입니다. 특정 상황에서만 개체 팩토리를 만들고 유지 관리하는 것이 더 복잡해집니다. 이 섹션에서는 이러한 상황을 요약합니다.

7.3.1 동적 구현

앞의 자전거 예시처럼 동일한 인터페이스를 다른 방식으로 구현하는 객체를 생성해야 하는 경우 팩토리 메소드나 간단한 팩토리 객체를 사용할 수 있습니다. 선택을 단순화하기 위해 구현 프로세스. 이 선택은 명시적으로 또는 암시적으로 이루어질 수 있습니다. 전자는 고객이 필요한 자전거 모델을 선택할 수 있는 자전거 예제와 유사하며, 다음 섹션의 XHR 팩토리 예제는 후자에 속합니다. 이 예제에서 반환되는 연결 개체의 유형은 감지된 대역폭 및 네트워크 지연에 따라 다릅니다. 시간 및 기타 요인. 이러한 상황에서는 일반적으로 동일한 인터페이스를 구현하고 동일하게 처리될 수 있는 일련의 클래스를 처리하게 됩니다. 이것이 JavaScript에서 팩토리 패턴을 사용하는 가장 일반적인 이유입니다.

7.3.2 설정 오버헤드 절약

객체에 서로 관련된 복잡한 설정이 필요한 경우 팩토리 패턴을 사용하면 각 객체에 필요한 코드 양을 줄일 수 있습니다. 이는 특정 유형의 모든 인스턴스에 대해 이 설정을 한 번만 수행해야 하는 경우 특히 유용합니다. 이러한 종류의 설정 코드를 클래스 생성자에 넣는 것은 설정 작업이 완료되더라도 새 인스턴스가 생성될 때마다 코드가 계속 실행되고 그렇게 하면 설정 코드가 다른 클래스에 분산되기 때문에 효율적이지 않습니다. 팩토리 메소드는 이러한 상황에 매우 적합합니다. 필요한 모든 개체를 인스턴스화하기 전에 한 번만 설정할 수 있습니다. 이 접근 방식은 인스턴스화되는 클래스 수에 관계없이 설정 코드를 한 곳에 유지합니다.

이 기능은 사용 중인 클래스에 외부 라이브러리를 로드해야 하는 경우 특히 유용합니다. 팩토리 메소드는 이러한 라이브러리를 확인하고 발견되지 않은 라이브러리를 동적으로 로드할 수 있습니다. 이러한 설정 코드는 한 곳에만 존재하므로 나중에 변경하기가 훨씬 쉽습니다.

7.3.3 많은 작은 개체를 사용하여 큰 개체 만들기

팩토리 메서드를 사용하면 여러 개의 작은 개체를 캡슐화하는 개체를 만들 수 있습니다. 자전거 객체의 생성자를 생각해 보세요. 자전거에는 바퀴, 프레임, 변속기 부품, 브레이크 등 여러 개의 작은 하위 시스템이 포함되어 있습니다. 하위 시스템이 더 큰 개체에 강력하게 결합되는 것을 원하지 않지만 런타임 시 많은 하위 시스템 중에서 선택하려는 경우 팩터리 메서드가 이상적입니다. 이 기술을 사용하면 하루에 특정 체인을 사용하여 판매하는 모든 자전거를 장착할 수 있으며, 다음 날 더 마음에 드는 다른 체인을 찾으면 해당 새로운 종류로 전환할 수 있습니다. 이러한 자전거 클래스의 생성자는 특정 체인 종류에 의존하지 않기 때문에 이 변경 사항을 구현하는 것은 쉽습니다. 이 장 뒷부분에 나오는 RSS 리더 예제에서는 이와 관련하여 팩토리 패턴을 사용하는 방법을 보여줍니다.


팩토리 패턴은 주로 객체 생성을 위한 인터페이스를 제공합니다. 팩토리 패턴은 "Java and Patterns"의 공식에 따라 세 가지 범주로 나뉩니다.
1. 단순 팩토리 패턴(Simple Factory)
2. 팩토리 메소드 패턴(Factory Method)
3. 패턴(추상 팩토리)
이 세 가지 모드는 위에서 아래로 점차 추상화되며 보다 일반적입니다. 또 다른 분류 방법이 있는데, 단순 팩토리 패턴을 팩토리 메소드 패턴의 특수한 경우로 간주하여 둘을 하나의 카테고리로 분류하는 것이다. 팩토리 패턴을 사용할 때 다음과 같은 두 가지 상황이 있습니다.
1. 코딩할 때 어떤 클래스 인스턴스를 생성해야 할지 예측하는 것은 불가능합니다.
2. 시스템은 제품 클래스 인스턴스가 어떻게 생성되고 결합되고 표현되는지에 대한 세부 사항에 의존해서는 안 됩니다.


3. Simple Factory Pattern
이름에서 알 수 있듯이 이 패턴 자체는 매우 간단하며 비즈니스가 상대적으로 단순할 때 사용됩니다.
세 가지 역할로 구성됩니다(관계는 아래 클래스 다이어그램에 표시됨).
1. 팩토리 역할: 이 모델의 핵심이며 특정 비즈니스 논리와 판단 논리를 포함합니다. 자바에서는 종종 구체적인 클래스로 구현됩니다.
2. 추상 제품 역할: 일반적으로 특정 제품에서 상속된 상위 클래스 또는 구현된 인터페이스입니다. Java에서는 인터페이스나 추상 클래스로 구현됩니다.
3. 특정 제품 역할: 팩토리 클래스에서 생성된 객체는 이 역할의 인스턴스입니다. Java의 구체적인 클래스로 구현됩니다.
그럼 간단한 팩토리 패턴은 어떻게 사용하나요? 긴 이론적인 설명보다 예를 들어보겠습니다. 그 신생 기업을 다루겠습니다: P
간단한 공장 모드를 사용한 후 이제 신생 기업은 차에 앉아 운전자에게 "운전해"라고 말하기만 하면 됩니다. 구현 방법을 살펴보겠습니다.
//추상 제품 역할
공용 인터페이스 Car{
public voiddrive()
}
//구체적 제품 역할
공용 클래스 Benz 구현; Car{
public voiddrive() {
System.out.println("Driving Benz ")
}
}
public 클래스 Bmw가 Car를 구현합니다.{
public voiddrive( ) {
System.out.println("Bmw 운전")
}
}
. . . (아우디에 대해서는 쓰지 않겠습니다 :P)
//Factory 클래스 역할
public 클래스 Driver{
//Factory 메서드
//반환 유형은 추상 제품 역할입니다
public static Car DriverCar(String s)throws Exception {
//판단 로직, 특정 제품 역할을 클라이언트에 반환
if(s.equalsIgnoreCase("Benz")) return new Benz()
else if; (s .equalsIgnoreCase("Bmw"))
return new Bmw();...
그렇지 않으면 new Exception()을 발생시킵니다. . .
//신생 기업을 환영합니다...
public class Magnate{
public static void main(String[] args){
try{
//운전자에게 내가 오늘이라고 전하세요. a Mercedes Benz
Car car = Driver.driverCar("benz")
//drive
car.drive()> 명령을 내립니다. . .
모든 수업을 하나의 파일에 담을 경우, 하나의 수업만 공개로 선언할 수 있다는 점 잊지 마시기 바랍니다. 프로그램 내 클래스 간의 관계는 다음과 같습니다.
간단한 팩토리 패턴입니다. 장점은 다음과 같습니다.
우선 단순한 팩토리 패턴을 사용한 후 우리 프로그램은 더 이상 "병"이 없고 실제 상황에 더 부합하며 클라이언트가 직접 제품을 만드는 책임이 면제됩니다. 개체이며 "소비" "제품"(신생 기업과 마찬가지로)에 대해서만 책임이 있습니다.
간단한 공장 모델의 개폐 원리를 분석해 보겠습니다. 업스타트가 자동차를 추가할 경우, 추상적인 제품이 정한 계약을 준수하는 한, 공장 클래스에 통보하는 한 고객이 사용할 수 있습니다. 따라서 제품 부분의 경우 확장 시에는 열리고 수정 시에는 닫히는 개방-폐쇄 원칙을 준수하지만, 자동차가 추가될 때마다 해당 비즈니스 로직을 팩토리 클래스에 추가해야 하기 때문에 공장 부분은 이상적이지 않은 것 같습니다. . 그리고 판단 논리는 개시 및 종료 원칙을 명백히 위반합니다.
그런 팩토리 클래스(저희 경우에는 운전사 마스터)를 만능 클래스, 혹은 신 클래스라고 부릅니다.
우리가 제시한 예는 가장 간단한 경우이지만, 실제 적용에서는 제품이 다단계 트리 구조일 가능성이 높습니다. 이러한 제품에 해당하는 단순 팩토리 패턴에는 팩토리 클래스가 하나만 있기 때문에 이로 인해 우리의 신 클래스가 무너지고 사랑스러운 프로그래머가 지칠 수 있습니다.(
앞서 언급했듯이 단순 팩토리 패턴은 비즈니스가 단순하지만 복잡한 비즈니스 환경에는 적합하지 않을 수 있습니다.
4. 먼저 구성을 살펴보겠습니다. 바:
1. 팩토리 메소드 패턴의 핵심이며, 특정 팩토리 역할이 구현해야 하는 인터페이스 또는 상속해야 하는 상위 클래스입니다. .
2. 특정 비즈니스 로직과 관련된 코드를 포함하며 해당하는 특정 제품 객체를 생성하기 위해 애플리케이션에 의해 호출됩니다.
3. 특정 제품 또는 인터페이스 구현. Java에서는 일반적으로 구현하는 추상 클래스 또는 인터페이스가 있습니다.
4. 특정 제품 역할: 특정 팩토리 역할에 의해 생성된 객체가 이 역할입니다. Java
클래스 다이어그램을 사용하여 이들 간의 관계를 명확하게 표현해 보겠습니다.
전체 예제를 사용하여 팩토리 패턴의 다양한 역할을 살펴보겠습니다. 점점 더 많은 자동차를 소유하고 있습니다. 그는 모든 자동차를 기억하고 유지해야합니다. 그래서 신생자는 그에게 동정하며 말했습니다. 앞으로는 그렇게 열심히 일하지 않아도 됩니다. 몇 명만 배정해 드리고, 그 분들만 관리하시면 됩니다!
//추상적인 제품 역할, 구체적인 제품 역할은 단순한 팩토리 패턴과 유사하지만 더 복잡해지기 때문에 여기서는 생략합니다. 🎜>public CardriverCar()
}
public class BenzDriver Implements Driver{
public Car DriverCar(){
return new Benz();
}
}
public class BmwDriver Implements Driver{
public Car DriverCar() {
return new Bmw();
}
}
......//특정 제품과 대응 관계를 형성해야 합니다. 간단히 설명합니다...
//초대해 주세요 Mr. Upstart
public class Magnate
{
public static void main(String[] args)
{
try{
Driver 드라이버 = new BenzDriver()
Car; car = drivers.driverCar();
car.drive()
}catch(예외 e)
{ }
}
}
팩토리 메소드는 단순 팩토리 패턴에서 구체적인 클래스를 코어로 사용하는 대신 추상 팩토리 역할을 코어로 사용합니다. 팩토리 메소드 패턴이 우리에게 무엇을 가져다 주는지 볼까요? 열기 및 닫기 원리를 사용하여 팩토리 메서드 패턴을 분석합니다. 새로운 제품(즉, 스타트업을 위한 자동차)이 생산되면 기존 코드를 수정하지 않고도 추상적인 제품 역할과 추상적인 팩토리 역할에서 제공하는 계약에 따라 생성되기만 하면 고객이 사용할 수 있습니다. 팩토리 메소드 패턴은 열고 닫는 원리와 완전히 일치하는 것 같습니다!
팩토리 메서드 패턴을 사용하면 발생할 수 있는 대부분의 비즈니스 요구 사항을 충족하기에 충분합니다. 그러나 제품 유형이 많을 경우 해당 팩토리 클래스도 많아지는데 이는 우리가 원하는 것이 아닙니다. 따라서 이 경우에는 간단한 팩토리 패턴과 팩토리 메소드 패턴을 사용하여 팩토리 클래스를 줄이는 것이 좋습니다. 즉, 제품 트리의 유사한 유형(보통 트리 잎의 형제)에 대해 간단한 팩토리 패턴을 사용하는 것이 좋습니다. 달성하기 위해.
물론 특별한 상황에는 특별한 처리가 필요합니다. 시스템에 다른 제품 트리가 있고 제품 ​​트리에 제품군이 있는 경우 이 경우 추상 팩토리 패턴이 사용될 수 있습니다.
5. 요약
간단한 팩토리 패턴과 팩토리 메소드 패턴이 우리에게 주는 영감을 살펴보겠습니다.
예제를 구현하기 위해 팩토리 패턴을 사용하지 않으면 코드가 많이 줄일 수 있습니다. 그냥 구현하세요. 기존 자동차는 다형성을 사용하지 않습니다. 하지만 유지보수성과 확장성 측면에서 매우 열악합니다(자동차를 추가한 후 영향을 받을 클래스를 상상할 수 있습니다). 따라서 확장성과 유지관리성을 향상시키기 위해서는 더 많은 코드를 작성하는 것이 좋습니다.
6. 추상 팩토리 패턴
먼저 제품군이 무엇인지 이해해 보겠습니다. 서로 다른 제품 계층 구조에 위치한 관련 기능을 갖춘 제품군입니다. 이 문장을 읽는 것만으로도 이 개념을 명확하게 이해할 수 있다면 감탄할 수밖에 없습니다. 이를 생생하게 설명하기 위해 예를 들어 보겠습니다.
사진 속 BMWCar와 BenzCar는 두 개의 제품군(제품 계층 구조)이고, 사진 속 BenzSportsCar와 BmwSportsCar는 하나의 제품군입니다. 모두 스포츠카 계열에 배치할 수 있어 기능이 연관되어 있습니다. 마찬가지로 BMWBussinessCar와 BenzSportsCar도 제품군입니다.
추상 제품 패턴으로 돌아가서, 팩토리 메소드 패턴과의 차이점은 생성해야 하는 객체의 복잡성에 있다고 말할 수 있습니다. 게다가 추상 팩토리 패턴은 세 가지 패턴 중에서 가장 추상적이고 일반적입니다. 추상 팩토리 패턴의 목적은 클라이언트에게 여러 제품군에서 제품 개체를 생성할 수 있는 인터페이스를 제공하는 것입니다. 또한, 추상 팩토리 패턴을 사용하려면 다음 조건을 충족해야 합니다.
1. 시스템에는 여러 제품군이 있으며, 시스템은 한 번에 하나의 제품만 소비할 수 있습니다.
2. 이에 따라 동일한 제품군을 사용할 수 있습니다.
추상 팩토리 패턴의 다양한 역할을 살펴보겠습니다(팩토리 메소드와 동일).
추상 팩토리 역할: 팩토리 메소드 패턴의 핵심으로, 전혀 관련이 없습니다. 응용 프로그램. 특정 팩토리 역할이 구현해야 하는 인터페이스이거나 상속되어야 하는 상위 클래스입니다. 자바에서는 추상 클래스나 인터페이스로 구현됩니다.
특정 팩토리 역할: 특정 비즈니스 로직과 관련된 코드를 포함합니다. 특정 제품에 해당하는 객체를 생성하기 위해 애플리케이션에서 호출됩니다. 자바에서는 구체적인 클래스로 구현됩니다.
추상 제품 역할: 특정 제품이 상속한 상위 클래스 또는 구현된 인터페이스입니다. Java에는 일반적으로 구현할 추상 클래스 또는 인터페이스가 있습니다.
특정 제품 역할: 특정 팩토리 역할에 의해 생성된 객체는 이 역할의 인스턴스입니다. 이는 Java의 특정 클래스에 의해 구현됩니다.
처음 두 모드를 보신 후에는 이 모드에서 다양한 캐릭터 간의 조화에 대한 아이디어를 얻으실 수 있을 것이므로 구체적인 예는 언급하지 않겠습니다. 다만 추상 팩토리 패턴을 사용하기 위한 조건만 충족하면 됩니다. 그렇지 않으면 여러 개의 제품군이 있더라도 제품군은 있지만 사용할 수 없습니다.



3가지 Java 팩토리 모드에 관한 더 많은 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿