티스토리 뷰
728x90
1. 의미
- 서로 관련있는 여러 객체를 만들어주는 인터페이스
- 서로 관련이 있는 객체들을 통째로 묶어서 팩토리 클래스를 만들고, 조건에 따라 생성하도록 다시 팩토리를 만들어서 객체를 생성하는 패턴
- 구체적으로 어떤 클래스의 인스턴스를 사용하는지 감출 수 있다.
- 팩토리 메서드와 비슷해보이지만, 초점은 팩토리를 사용하는 클라이언트쪽으로 바라보고 있다.
- 클라이언트(호출) 코드를 인터페이스 기반으로 코딩할 수 있게 도와주는 패턴
2. 작성 방법
public interface Anchor {
}
public class WhiteAnchor implements Anchor {
}
public interface Wheel {
}
public class WhiteWheel implements Wheel {
}
public interface ShipPartsFactory {
Anchor createAnchor();
Wheel createWheel();
}
public class WhiteshipPartsFactory implements ShipPartsFactory {
@Override
public Anchor createAnchor() {
return new WhiteAnchor();
}
@Override
public Wheel createWheel() {
return new WhiteWheel();
}
}
// 추상 팩토리 사용 전
public class WhiteshipFactory extends DefaultShipFactory {
@Override
public Ship createShip() {
Ship ship = new Whiteship();
ship.setAnchor(new WhiteAnchor()); //구체적인 클래스에 의존하고 있음 > 해당 부분이 개선 필요
ship.setWheel(new WhiteWheel());
return ship;
}
}
// 추상 팩토리 사용 후
public class WhiteshipFactory extends DefaultShipFactory {
private ShipPartsFactory shipPartsFactory;
public WhiteshipFactory(ShipPartsFactory shipPartsFactory) {
this.shipPartsFactory = shipPartsFactory;
}
@Override
public Ship createShip() {
Ship ship = new Whiteship();
ship.setAnchor(shipPartsFactory.createAnchor()); //팩토리를 통해서 가져옴
ship.setWheel(shipPartsFactory.createWheel());
return ship;
}
}
2.1. 새로운 제품군(Pro)이 필요하다면, 새로운 제품군을 제공할 팩토리 생성
public class WhiteAnchorPro implements Anchor{
}
public class WhiteWheelPro implements Wheel {
}
public class WhitePartsProFactory implements ShipPartsFactory {
@Override
public Anchor createAnchor() {
return new WhiteAnchorPro();
}
@Override
public Wheel createWheel() {
return new WhiteWheelPro();
}
}
public class Client {
public static void main(String[] args) {
ShipFactory shipFactory = new WhiteshipFactory(new WhitePartsProFactory());
Ship ship = shipFactory.createShip();
System.out.println(ship.getAnchor().getClass()); //WhiteAnchorPro
System.out.println(ship.getWheel().getClass()); //WhiteWheelPro
}
}
3. 팩토리 메소드 패턴과 차이점
- 모양과 효과는 비슷하지만, 둘 다 구체적인 객체 생성 과정을 추상화한 인터페이스를 제공한다.
- 관점
- 팩토리 메소드 패턴은 "팩토리를 구현하는 방법(inheritance)"
- 추상 팩토리 패턴은 "팩토리를 사용하는 방법(composition)"
- 목적
- 팩토리 메소드 패턴은 구체적인 객체 생성 과정을 하위 또는 구체적인 클래스로 옮기는 것이 목적
- 추상 팩토리 패턴은 관련있는 여러 객체를 구체적인 클래스에 의존하지 않고 만들 수 있게 해주는 것이 목적
위글은 인프런의 코딩으로 학습하는 GoF의 디자인 패턴강의를 정리하였습니다.
백기선님의 수락으로 정리하였으며 더 자세한 내용은 강의를 수강하시기 바랍니다.
https://www.inflearn.com/course/%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4/dashboard
728x90
'디자인 패턴' 카테고리의 다른 글
06. 어댑터 패턴 (0) | 2022.02.10 |
---|---|
05. 프로토타입 패턴 (0) | 2022.02.10 |
04. 빌더패턴 (0) | 2022.02.10 |
02. 팩토리 메소드 패턴 (0) | 2022.02.10 |
01. 싱글톤 패턴 (0) | 2022.02.10 |
댓글