java
Design Patterns - Abstract Factory
쭈꾸마뇽
2021. 11. 20. 13:24
서로 관련있는 여러 객체를 만들어주는 인터페이스
구체적으로 어떤 클래스의 인스턴스(concrete protuct)를 사용하는지 감출 수 있다
public interface ShipPartsFactory {
Anchor createAnchor();
Wheel createWheel();
}
public interface Anchor {
}
public interface Wheel {
}
public class WhiteShipFactory extends DefaultShipFactory {
private final 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;
}
}
WhiteShipFactory에서는 WhitShip을 만들어주는데 경우에 따라 WhiteShip의 부품들을 다른 종류의 부품을 사용할 필요가 있을 수 있다. 그냥 구현을 한다고 하면 Ship을 만들 때 조건을 주어서 분기처리를 해 분기마다 다른 부품을 달아줄 수 있지만 추상 팩토리 패턴을 사용하면 부품을 달아줄때도 부품을 만드는 팩토리클래스를 주입하여 분기처리 없이 경우에 따른 부품을 달아 줄 수 있다.
public class WhiteAnchorPro implements Anchor{
}
public class WhiteWheelPro implements Wheel {
}
------------------------------------------------------------------
public class WhiteAnchor implements Anchor {
}
public class WhiteWheel implements Wheel {
}
public class ShipInventory {
public static void main(String[] args) {
ShipFactory shipFactory = new WhiteShipFactory(new WhiteShipPartsFactory());
Ship ship = shipFactory.createShip();
System.out.println(ship.getAnchor().getClass());
System.out.println(ship.getWheel().getClass());
}
}
클라이언트에서 WhiteShipFactory 객체를 생성할 때 부품을 생산할 ShipPartsFactory를 상속한 구현 클래스를 주입해 주면 구현 클래스가 부품을 생산하여 Ship을 완성시킨다.
팩토리 메소드 패턴과 굉장히 흡사한데 무엇이 다른건가?
- 모양과 효과는 비슷하지만
- 둘 다 구체적인 객체 생성 과정을 추상화한 인터페이스를 제공한다
- 관점이 다르다
- 팩토리 메소드 패턴은 "팩토리를 구현하는 방법(inheritance)"에 초점을 둔다
- 추상 팩토리 패턴은 "팩토리를 사용하는 방법(composition)"에 초점을 둔다
- 목적이 조금 다르다
- 팩토리 메소드 패턴은 구체적인 객체 생성 과정을 하위 또는 구체적인 클래스로 옮기는 것이 목적
- 추상 팩토리 패턴은 관련있는 여러 객체를 구체적인 클래스에 의존하지 않고 만들 수 있게 해주는 것이 목적
코딩으로 학습하는 GoF의 디자인 패턴 - 인프런 | 강의
디자인 패턴을 알고 있다면 스프링 뿐 아니라 여러 다양한 기술 및 프로그래밍 언어도 보다 쉽게 학습할 수 있습니다. 또한, 보다 유연하고 재사용성이 뛰어난 객체 지향 소프트웨어를 개발할
www.inflearn.com