생성 패턴 중 하나로 객체를 생성할 때 어떤 클래스의 인스턴스를 만들지 서브 클래스에서 결정하게 한다.
즉, 인스턴스 생성을 서브 클래스에게 위임한다.
부모 추상 클래스는 인터페이스에만 의존하고 실제로 어떤 구현 클래스를 호출할지는 서브 클래스에서 구현한다.
이렇게 하면 새로운 구현 클래스가 추가되어도 기존 Factory 코드의 수정 없이 새로운 Factory를 추가하면 된다.
* 객체 생성 처리를 서브 클래스로 분리해 처리하도록 하는 패턴
| - 생성 객체 타입을 예측할 수 없을 때 사용 - 생성할 객체를 기술하는 책임을 서브클래스에게 정의하고자 할 때 - 객체 생성의 책임을 서브클래스에 위임시키고 서브클래스에 대한 정보를 은닉하고자 할 |

| Product - 팩토리 메서드로 생성될 객체의 공통 인터페이스 |
| ConcreteProduct *product1 - 구체적으로 객체가 생성되는 클래스 |
| Creator - 팩토리 메서드를 갖는 클래스 |
| ConcreteCreator - 팩토리 메서드를 구현하는 클래스로 ConcreteProduct 객체를 생성 |
| 생성 패턴 : - 객체 생성에 관련된 패턴 - 객체의 생성과 조합을 캡슐화해 특정 객체가 생성되거나 변경되어도 프로그램 구조에 영향을 크게 받지 않도록 유연성을 제공한다. |
Interface Vehicle
public interface Vehicle {
void create();
}
- Interface method 를 override하여 각각 class 마다 로직 추가
Class Ship
public class Ship implements Vehicle {
@Override
public void create() {
System.out.println("배 생산");
}
}
Class Car
public class Car implements Vehicle {
@Override
public void create() {
System.out.println("자동차 생산");
}
}
Abstract AbstractVehicleFactory
public abstract class AbstractVehicleFactory {
public Vehicle newInstance() {
Vehicle vehicle = createVehicle();
vehicle.create();
return vehicle;
}
protected abstract Vehicle createVehicle();
}
- 외부에서 객체를 생성할 때는 newInstance() 메서드를 호출
- 실제 어떤 객체를 생성할지에 대해서는 추상클래스를 상속받아 override 하여 서브클래스에서 정의
- java8 부터는 인터페이스에서 default 메서드를 사용할 수 있기 떄문에 인터페이스로 정의할 수 있음.
Class ShipFactory
public class ShipFactory extends AbstractVehicleFactory{
@Override
protected Vehicle createVehicle() {
return new Ship();
}
}
Class CarFactory
public class CarFactory extends AbstractVehicleFactory{
@Override
protected Vehicle createVehicle() {
return new Car();
}
}
Main
public class Main {
public static void main(String[] args) {
AbstractVehicleFactory factory = new CarFactory();
Vehicle vehicle1 = factory.newInstance();
AbstractVehicleFactory shipFactory = new ShipFactory();
Vehicle ship = shipFactory.newInstance();
}
}
- 기존 코드 변경없이 새로 선언한 클래스만 사용하여 확장 가능

장점 :
Factory Method Pattern 의 가장 큰 장점은 수정에 닫혀있고 확장에는 열려있는 OCP 원칙을 지킬 수 있다는 점이다.
*개방/폐쇄 원칙 : 기존 코드의 수정없이 확장 가능
단점 :
패턴을 구현하기 위해 많은 자식 클래스들을 도입해야하므로 코드가 복잡해질 수 있다.
참고 :
https://refactoring.guru/ko/design-patterns/factory-method
팩토리 메서드 패턴
/ 디자인 패턴들 / 생성 패턴 팩토리 메서드 패턴 다음 이름으로도 불립니다: 가상 생성자, Factory Method 의도 팩토리 메서드는 부모 클래스에서 객체들을 생성할 수 있는 인터페이스를 제공하지
refactoring.guru
https://bcp0109.tistory.com/367
Factory 패턴 (2/3) - Factory Method (팩토리 메서드) 패턴
1. Overview Factory 패턴은 객체 생성과 관련된 디자인 패턴입니다. 1편에서 봤던 Simple Factory 는 객체 생성 역할을 담당하면서 각 클라이언트에서 구현 클래스에 직접 의존하지 않도록 분리했습니다.
bcp0109.tistory.com
팩토리 메서드 패턴 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. -->
ko.wikipedia.org
https://pjh3749.tistory.com/266
[디자인패턴] 옵저버 패턴 (Observer Pattern) 아주 간단하게 정리해보기
옵저버 패턴이란? 옵저버란 스타크래프트 프로토스의 유닛으로 적들을 관찰하기 위해 탄생한 유닛이다. 테란전에서 필수 유닛이며 옵저버 패턴(observer pattern)은 객체의 상태 변화를 관찰하는 관
pjh3749.tistory.com
| [Design Pattern] Abstract Factory Pattern (0) | 2023.03.22 |
|---|---|
| [Design Pattern] Command Pattern (0) | 2023.03.21 |
| [Design Pattern] Observer Pattern (0) | 2023.03.18 |
| [Design Pattern] Template Method Pattern (0) | 2023.03.17 |
| [java] ThreadPool (1) | 2023.02.23 |