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