정의 : 객체 생성을위한 인터페이스를 정의하고 서브 클래스가 인스턴스화 할 클래스를 결정하게하고 공장 메소드는 클래스의 인스턴스화를 서브 클래스로 지연시킵니다.
유형 : 클래스 패턴 클래스 다이어그램 작성 :
공장 방법 패턴 코드
인터페이스 iproduct {public void productMethod (); } class product는 iproduct {public void productMethod () {System.out.println ( "product"); }} 인터페이스 ifactory {public iproduct createProduct (); } Class Factory는 ifactory {public iproduct createProduct () {return new product (); }} public class client {public static void main (String [] args) {ifactory factory = new Factory (); iProduct Produce = factory.createproduct (); Produce.ProductMethod (); }} 공장 모드 :
우선, 우리는 공장 모델에 대해 이야기해야합니다. 공장 모드는 추상화 정도에 따라 세 가지 유형으로 나뉩니다 : 간단한 공장 모드 (정적 공장 모드라고도 함),이 기사에 설명 된 공장 방법 모드 및 초록 공장 모드. 공장 모드는 프로그래밍에 종종 사용되는 모델입니다. 주요 장점은 다음과 같습니다.
코드 구조를 명확하고 효과적으로 캡슐화 할 수 있습니다. 프로그래밍에서 제품 클래스의 인스턴스화는 때때로 복잡하고 변하기 쉽습니다. 공장 모델을 통해 제품의 인스턴스화가 캡슐화되어 발신자가 제품의 인스턴스화 프로세스에 대해 신경 쓰지 않아도되고 원하는 제품을 얻기 위해 공장에 의존 할 필요가 없습니다.
발신자의 특정 제품 범주를 차단합니다. 공장 모드를 사용하는 경우 발신자는 제품의 인터페이스에만 관심이 있습니다. 특정 구현과 관련하여 발신자는 전혀 관리 할 필요가 없습니다. 특정 구현이 변경 되더라도 발신자에게 영향을 미치지 않습니다.
커플 링을 줄입니다. 제품 클래스의 인스턴스화는 일반적으로 매우 복잡합니다. 많은 수업에 의존해야하며,이 클래스는 발신자에게 전혀 알려질 필요가 없습니다. 공장 방법을 사용하는 경우 제품 클래스를 인스턴스화 한 다음 사용하기 위해 발신자에게 넘겨주는 것입니다. 발신자의 경우 제품이 의존하는 클래스는 투명합니다.
공장 방법 모드 :
공장 방법 패턴의 클래스 다이어그램을 통해 공장 방법 패턴에 네 가지 요소가 있음을 알 수 있습니다.
공장 인터페이스. 공장 인터페이스는 공장 방법 패턴의 핵심이며 발신자와 직접 제품을 제공하는 데 사용됩니다. 실제 프로그래밍에서, 추상 클래스는 때때로 발신자와 상호 작용하는 인터페이스로 사용되며, 이는 본질적으로 동일합니다.
공장 구현. 프로그래밍에서 공장 구현은 제품을 인스턴스화하는 방법을 결정하며 이는 확장을 달성하는 방법입니다. 필요한 제품의 수는 많은 특정 공장 구현입니다.
제품 인터페이스. 제품 인터페이스의 주요 목적은 제품 사양을 정의하는 것이며 모든 제품 구현은 제품 인터페이스에서 정의 된 사양을 준수해야합니다. 제품 인터페이스는 발신자가 대부분의 관심사이며 제품 인터페이스 정의의 장점과 단점은 발신자 코드의 안정성을 직접 결정합니다. 마찬가지로 제품 인터페이스는 추상 클래스로 대체 될 수 있지만 Richter 교체 원칙을 위반하지 않도록주의하십시오.
제품 구현. 제품 인터페이스의 특정 범주는 클라이언트의 제품의 특정 동작을 결정합니다.
공장 방법 모델의 장점 :
1. 좋은 포장 및 모듈 사이의 커플 링을 줄입니다.
2. 제품 인터페이스와 제품 범주를 차단합니다.
3. 일반적인 디커플링 프레임 워크. 높은 수준의 모듈은 제품의 추상 클래스 만 알아야합니다.
4. Dimitese 법칙, 반전에 대한 의존의 원칙 및 Richter 대체 원칙을 준수합니다.
해당 시나리오 :
간단한 공장 모델, 공장 방법 모델 또는 추상 공장 모델이든 비슷한 특성이 있으므로 해당 시나리오도 비슷합니다.
첫째, 생성 클래스 패턴으로서 공장 방법 패턴은 복잡한 객체가 필요한 곳 어디에서나 사용할 수 있습니다. 주목해야 할 것은 복잡한 객체는 공장 모드를 사용하는 데 적합하지만 간단한 객체, 특히 새로운 것을 통해 만들 수있는 객체는 공장 모드를 사용할 필요가 없습니다. 공장 모델을 사용하는 경우 시스템의 복잡성을 증가시키는 공장 클래스를 소개해야합니다.
둘째, 공장 모델은 전형적인 분리 모드이며, Dimitter 법칙은 공장 모델에서 특히 명백합니다. 발신자가 제품을 직접 조립하기 위해 종속성을 추가 해야하는 경우 공장 모델 사용을 고려할 수 있습니다. 물체 사이의 커플 링을 크게 줄입니다.
다시 말하지만, 공장 모델은 추상 아키텍처에 의존하기 때문에 제품을 구현 클래스에 인스턴스화하는 작업을 완료하여 확장 성이 향상됩니다. 다시 말해, 시스템이 더 나은 확장 성이 필요할 때 공장 모델을 고려할 수 있으며 다른 구현 공장으로 다른 제품을 조립할 수 있습니다.
일반적인 응용 프로그램
공장 모델의 장점을 설명하기 위해 자동차를 조립하는 것보다 더 적절한 예는 없을 수 있습니다. 시나리오는 다음과 같습니다. 자동차는 엔진, 휠 및 섀시로 구성되어 있으며 이제 자동차를 조립하여 발신자에게 넘겨야합니다. 공장 모드를 사용하지 않으면 코드는 다음과 같습니다.
클래스 엔진 {public void getStyle () {System.out.println ( "이것은 자동차 엔진입니다"); }} class Underpan {public void getStyle () {System.out.println ( "자동차의 섀시입니다"); }} 클래스 휠 {public void getStyle () {System.out.println ( "이것은 차의 타이어입니다"); }} public class client {public static void main (String [] args) {엔진 엔진 = new Engine (); Underpan exerpan = new Underpan (); 휠 휠 = 새로운 휠 (); ICAR CAR = 새 차 (Underpan, 휠, 엔진); car.show (); }}자동차를 조립하기 위해 발신자는 엔진, 섀시 및 타이어를 인스턴스화해야 하며이 차량의 구성 요소는 발신자와 무관하며 Dimitt 법칙을 심각하게 위반하고 커플 링이 너무 높다는 것을 알 수 있습니다. 그리고 확장에 매우 불리합니다. 또한이 예에서는 엔진, 섀시 및 타이어가 비교적 구체적입니다. 실제 응용 분야에서 이러한 제품의 구성 요소는 추상적 일 수 있으며 발신자는 제품을 조립하는 방법을 모릅니다. 공장 방법이 사용되면 전체 아키텍처가 훨씬 더 명확 해 보입니다.
인터페이스 ifactory {public icar createcar (); } 클래스 팩토리는 ifactory {public icar createcar () {엔진 엔진 = 새로운 엔진 (); Underpan exerpan = new Underpan (); 휠 휠 = 새로운 휠 (); ICAR CAR = 새 차 (Underpan, 휠, 엔진); 반환 자동차; }} public class client {public static void main (String [] args) {ifactory factory = new Factory (); icar car = factory.createcar (); car.show (); }}공장 방법을 사용한 후, 호출 측면의 커플 링 정도가 크게 줄어 듭니다. 그리고 공장의 경우 확장 할 수 있습니다. 앞으로 다른 자동차를 조립하려면 다른 공장 구현 만 추가하면됩니다. 유연성과 안정성이 크게 향상되었습니다.
추신 : 공장 방법 모드 및 간단한 공장 모드
위에서 언급 한 간단한 공장 모델은 공장 방법 모델과 매우 유사합니다. Factory Method 클래스의 핵심은 추상 공장 클래스이며 간단한 공장 모델은 콘크리트 클래스에 핵심을 배치합니다. 공장 방법 모델과 간단한 공장 모델의 차이는 분명하지 않습니다.