추상 팩토리(Abstract Method) 패턴 : 생성패턴
서로 관련이 있는 객체들을 통째로 묶어서 팩토리 클래스로 만들고, 이들 팩토리를 조건에 따라 생성하도록 다시 팩토리를 만들어서 객체를 생성하는 패턴
팩토리 메서드와 유사하지만, 큰 차이점은 추상 팩토리는 연관된 객체들을 모은다는 것에 있다.
팩토리 패턴은 하나의 객체를 생성하는 데 사용되지만, 추상 팩토리 패턴은 팩토리 객체가 아닌 다른 객체 내부에 구현되어 해당 객체에서 여러 타입의 객체를 생성한다.
AbstractFactory: 실제 팩토리 클래스의 공통 인터페이스
ConcreteFactory: 구체적인 팩토리 클래스로 AbstractFactory 클래스의 추상 메서드를 오버라이드함으로써 구체적인 제품을 생성한다.
AbstractProduct: 제품의 공통 인터페이스
ConcreteProduct: 구체적인 팩토리 클래스에서 생성되는 구체적인 제품이다.
추상 팩토리 패턴의 장단점
장점
- 팩토리 메서드 패턴과 마찬가지로 수정에는 닫혀있고, 확장에는 열려있다.
- 여러 개의 비슷한 집합 객체 생성을 하나의 팩토리에 모아둘 수 있다.
단점
- 팩토리 메서드 패턴과 마찬가지로 클래스 갯수가 늘어난다.
추상 팩토리 패턴과 팩토리 메서드 패턴
팩토리 메서드 패턴은 인스턴스를 만드는 과정에 집중되어 있으며, 팩토리를 구현하는 방법에 초점을 둔다. 구체적인 인스턴스 생성 과정을 하위 또는 구체적인 클래스로 옮기는 것이 목적이다.
추상 팩토리 패턴은 클라이언트가 추상화된 인터페이스를 통해 객체를 생성할 수 있도록 해주며, 팩토리를 사용하는 방법에 초점을 둔다. 관련있는 여러 객체를 구체적인 클래스에 의존하지 않고 만들 수 있게 해주는 것이 목적이다.
결국은 위에 말했다시피 연관된 여러 객체를 모은다는 추상 팩토리 패턴의 특징으로 팩토리 메서드와의 이러한 차이점이 생기는 것 같다.
쉽게 말해 추상 팩토리 패턴은 팩토리 메서드의 집합체와 같은 느낌이다.
추상 팩토리 패턴의 예시
Player
public interface Player {
}
public class Warrior implements Player{
}
public class Wizard implements Player{
}
Weapon
public interface Weapon{
}
public class Wand implements Weapon{
}
public class Sword implements Weapon{
}
UserFactory
public interface UserFactory {
Player createPlayer();
Weapon createWeapon();
}
public class WarriorFactory implements UserFactory{
@Override
public Player createPlayer() {
return new Warrior();
}
@Override
public Weapon createWeapon() {
return new Sword();
}
}
public class WizardFactory implements UserFactory{
@Override
public Player createPlayer() {
return new Wizard();
}
@Override
public Weapon createWeapon() {
return new Wand();
}
}
Client
public class client {
public static void main(String[] args) {
create(new WarriorFactory());
create(new WizardFactory());
}
public static void create(UserFactory userFactory){
Player player = userFactory.createPlayer();
Weapon weapon = userFactory.createWeapon();
}
}
Reference
'OOP > Design Pattern' 카테고리의 다른 글
05. 프로토타입(Prototype) 패턴 (0) | 2023.02.13 |
---|---|
04. 빌더(Builder) 패턴 (0) | 2023.02.13 |
02. 팩토리 메서드(Factory Method) 패턴 (0) | 2023.02.13 |
00. GoF 디자인 패턴 (0) | 2023.02.13 |
01. 템플릿 메소드(Template Method) 패턴 (0) | 2023.01.26 |