빠르고 이해하기 쉬운 Java의 3가지 팩토리 패턴
1. Simple Factory 패턴(Simple Factory)
은 특히 공통 인터페이스로 많은 수의 클래스를 인스턴스화하는 역할을 담당하며 미리 알 필요가 없습니다. 사용할 스키마 클래스를 매번 인스턴스화할지 여부입니다. 객체를 생성하기 위한 인터페이스를 정의하고 하위 클래스는 인스턴스화할 클래스를 결정합니다.
//과일 인터페이스 정의 public 인터페이스 Fruit { void plantFruit(); void eatFruit() } //Apple은 과일 인터페이스를 구현합니다. public class Apple은 Fruit { @Override public void plantFruit() { System .out.println("Grow apples."); } @Override public void eatFruit() { System.out.println("Eat apples.") } } //Orange는 과일 인터페이스를 구현합니다. public 클래스 Orange는 Fruit를 구현합니다. { @Override public void plantFruit() { System.out.println("오렌지 심기.") } @Override public void eatFruit() { System.out.println("오렌지 먹기.") } //과일 공장 public class FruitFactory { public static Fruit getFurit(String FruitName) { //간단한 팩토리 모드 if (fruitName.equalsIgnoreCase("Apple")) { // 사과인 경우 Apple 인스턴스를 반환 return new Apple() } else; if (fruitName.equalsIgnoreCase ("Orange")) { // 오렌지색 인스턴스를 반환합니다. return new Orange() } else { return null } } } //테스트 클래스 public class Test { public static void; main(String[]args) { //간단한 팩토리 모드 호출 FruitFactory.getFurit("Orange").plantFruit() } } 출력: 오렌지를 심습니다.
요약
A: 사과를 사고 싶다면 공장 역할(FruitFactory)에 요청하면 됩니다. 요청을 받은 후 팩토리 역할은 어떤 제품을 만들고 제공할지 결정합니다.
B: 하지만 공장 역할(FruitFactory)에게는 새로운 제품을 추가하는 것(예: 딸기 추가)이 고통스러운 과정입니다. 공장 역할은 각 제품, 제품 생성 방법, 고객에게 제공 시기를 알아야 합니다. 즉, 새로운 제품을 받아들이는 것은 공장을 수정하는 것을 의미합니다.
C: 그래서 이 단순한 공장 모델의 개방성은 상대적으로 좋지 않습니다.
================================== = =========================
2. 팩토리 메소드 패턴(Factory Method)
객체 생성을 위임합니다. 이는 생성자가 아닌 상위 클래스에 정의된 표준 메서드에 의해 수행됩니다. 어떤 종류의 객체를 만들어야 하는지 결정하는 것은 특정 하위 클래스에 달려 있습니다.
//과일 인터페이스 정의 public 인터페이스 Fruit { void plantFruit(); void eatFruit() } //Apple은 과일 인터페이스를 구현합니다. public class Apple은 Fruit { @Override public void plantFruit() { System .out.println("Grow apples."); } @Override public void eatFruit() { System.out.println("Eat apples.") } } //Orange는 과일 인터페이스를 구현합니다. public 클래스 Orange는 Fruit를 구현합니다. { @Override public void plantFruit() { System.out.println("오렌지 심기.") } @Override public void eatFruit() { System.out.println("오렌지 먹기.") } //과일 공장 ([b ]참고: 이 팩토리는 인터페이스로 선언되어 있으며 확장성이 좋습니다[/b]) public Interface FactoryMethod { /*** 팩토리 메소드*/ Fruit getFruit() //과일을 얻는 프로세스 정의} // Apple의 Fruit Factory 구현 public class getApple Implements FactoryMethod{ @Override public Fruit getFruit() { // TODO 자동 생성 메서드 스텁 return new Apple() } } // Orange의 Fruit Factory 구현 public class getOrange Implements FactoryMethod { @ Override public Fruit getFruit() { // TODO 자동 생성 메소드 스텁 return new Orange(); } } //테스트 클래스 public class TestFactoryMethod { public static void main(String[] args) { getApple apple = new getApple() ; apple.getFruit().eatFruit(); } } 출력: 사과를 먹습니다.
요약:
A: 팩토리 메소드 패턴과 단순 팩토리 패턴의 구조적 차이는 명백합니다. 팩토리 메소드 패턴의 핵심은 추상 팩토리 클래스인 반면, 단순 팩토리 패턴은 코어를 구체적인 클래스에 배치합니다. 팩토리 메소드 패턴을 사용하면 많은 구체적인 팩토리 클래스가 추상 팩토리 클래스의 생성 동작을 상속할 수 있으므로 여러 개의 간단한 팩토리 패턴이 통합되어 간단한 팩토리 패턴이 대중화됩니다.
B: 팩토리 메소드 패턴은 퇴화 후에는 단순 팩토리 패턴과 매우 유사해질 수 있습니다. 시스템에 하나의 구체적인 팩토리 클래스만 필요하다고 확신한다면 추상 팩토리 클래스를 구체적인 팩토리 클래스에 병합하는 편이 낫다고 상상해 보세요. 어쨌든 특정 팩토리 클래스는 하나만 있으므로 팩토리 메서드를 정적 메서드로 변경하는 것이 좋습니다. 이때 간단한 팩토리 패턴을 얻게 됩니다.
C: 새 과일을 추가해야 하는 경우 새 과일 클래스와 해당 팩토리 클래스만 추가하면 됩니다. 클라이언트를 수정하거나 추상 팩터리 역할 또는 기타 기존의 구체적인 팩터리 역할을 수정할 필요가 없습니다. 새로운 과일 카테고리를 추가하기 위해 이 시스템은 "개방-폐쇄" 원칙을 완벽하게 지원합니다.
D: 팩토리 메소드 모드의 경우 하나의 카테고리(예: 이 예에서는 과일)에만 적용되지만 고기도 구매하려는 경우에는 작동하지 않습니다.
======================================= ===== ===================
3. 추상 팩토리 패턴(Abstract Factory)
추상 팩토리 패턴이라고 할 수 있습니다. 간단한 팩토리 패턴의 확장이 되는 주요 차이점은 생성해야 하는 객체가 복잡하다는 것입니다.
추상 팩토리 패턴에는 하나 이상의 추상 제품이 있어 하나 이상의 제품군을 구성할 수 있습니다. 제품군이 하나만 있는 경우 추상 팩토리 패턴은 실제로 팩토리 메서드 패턴으로 변질됩니다.
요약:
A: 추상 팩토리 패턴은 클라이언트에 인터페이스를 제공하여 클라이언트가 특정 제품 유형을 지정하지 않고도 여러 제품군을 생성할 수 있도록 합니다. 물체. 이것이 추상 팩토리 패턴의 목적입니다.
B: 추상 팩토리 패턴은 모든 형태의 팩토리 패턴 중에서 가장 추상적이고 일반적인 형태입니다.
C: 추상 팩토리 패턴과 팩토리 메소드 패턴의 가장 큰 차이점은 팩토리 메소드 패턴은 제품(과일) 계층 구조를 대상으로 하는 반면 추상 팩토리 패턴은 여러 제품 계층 구조(과일, 고기)를 대상으로 해야 한다는 것입니다. .