티스토리 뷰

디자인 패턴

03. 추상 팩토리 패턴

jin-park 2022. 2. 10. 16:45

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

 

코딩으로 학습하는 GoF의 디자인 패턴 - 인프런 | 강의

디자인 패턴을 알고 있다면 스프링 뿐 아니라 여러 다양한 기술 및 프로그래밍 언어도 보다 쉽게 학습할 수 있습니다. 또한, 보다 유연하고 재사용성이 뛰어난 객체 지향 소프트웨어를 개발할

www.inflearn.com

 

'디자인 패턴' 카테고리의 다른 글

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
댓글