Computer Science

Abstract Factory | 추상 팩토리 패턴

연_우리 2022. 8. 14. 21:50
반응형

목차

     

     

     

    어떤 상황에서 쓰일까?

    팩토리 메서드 패턴에서 Ship예제를 살펴보았다.

    Ship에 Anchor와 Wheel 부품을 추가하려고한다

     

    이때, Anchor와 Wheel은 서로 짝지어지는 부품이다! 

    Anchor - Wheel / AnchorPro - WheelPro / AnchorV2 - WheelV2 로 짝지어져서 추가되어야한다

     

    기존 코드의 변경을 최소화하여 부품을 추가하고 수정할 수 있는 방법은 없을까?

     

     

    추상 팩토리 패턴이란?

    여러 관련있는 객체를 만들어주는 인터페이스를 만드는 패턴이다

    팩토리 메서드 패턴과 유사하지만, 구체적으로 어떤 클래스의 인스턴스를 사용하는지 감출 수 있고

    서로 유사한 객체가 조합되어야하는 경우 팩토리를 인터페이스화 하여 

    WhiteAnchor - BlackWheel의 조합을 방지할 수 있다!

     

     

     

    구현방법

    기존코드

    public class WhiteshipFactory implements ShipFactory {
    
        @Override
        public Ship createShip() {
            Ship ship = new Whiteship();
            ship.setAnchor(new WhiteAnchor());
            ship.setWheel(new WhiteWheel());
            return ship;
        }
    }

     

     

     

    변경코드

    public class WhiteAnchor implements Anchor{
    }
    
    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();   
            //return값은 항상 Wheel을 implements해야하므로 규악을 지킨 Wheel만 들어올 수 있게한다
        }
    }
    public class WhiteShipFactory implement ShipFactory {
    
        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());
            //🔥shipPartsFactory에서 이미 정해진 Anchor와 Wheel이 만들어진다.
            
            return ship;
        }
    }
    팩토리 메서드 패턴이라면 위 코드는 아래와 같았을 것이다.
    ship.setAnchor(new WhiteAnchor());
    ship.setWheel(new WhiteWheel());

    Anchor와 Wheel이 짝지어져야하는 상황에서
    ship.setAnchor(new WhiteAnchor());
    ship.setWheel(new BlackWheel());

    new로 직접 객체를 주입한다면 BlackWheel()처럼 객체가 잘못들어가는 경우가 발생할 수 있다!!!

    추상 팩토리 패턴에서는 ShipPartsFactory 자리에 받는
    WhiteShipPartsFactory에 이미 WhiteAnchor(), WhiteWheel()을 반한하도록 지정되어있으니 
    유사한 객체가 조립되어야 하는 경우 실수를 방지할 수 있다.

     

    public class Client {
    	public static void main(String[] args){
        	ShipFactory shipFactory = new WhiteShipFactory(new WhitePartsFactory());
            Ship ship = shipFactory.createShip();
            
            System.out.println(ship.getAnchor().getClass());
            //WhiteAnchor
            
            System.out.println(ship.getWheel().getClass());
            //WhiteWheel
        }
    }

     

     

     

     

     

     

    Ummm... 팩토리 메서드 패턴과 추상 팩토리 패턴의 차이는?

    관점의 차이

    팩토리 메소드 패턴은 “팩토리를 구현하는 방법 (inheritance)”에 초점

    추상 팩토리 패턴은 “팩토리를 사용하는 방법 (composition)”에 초점

     

    목적의 차이

    팩토리 메소드 패턴은 구체적인 객체 생성 과정을 하위 또는 구체적인 클래스로 옮기는 것이 목적.

     => 그 자체로 하나의 객체를 생성하는 경우

    추상 팩토리 패턴은 관련있는 여러 객체를 구체적인 클래스에 의존하지 않고 만들 수 있게 해주는 것이 목적.

     => 여러 유사 객체를 생성해서 조립하는 경우

     

     

     

     

     

     

     

    참고

    http://daplus.net/java-%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4-%ED%8C%A9%ED%86%A0%EB%A6%AC-vs-%ED%8C%A9%ED%86%A0%EB%A6%AC-%EB%A9%94%EC%86%8C%EB%93%9C-vs-%EC%B6%94%EC%83%81-%ED%8C%A9%ED%86%A0%EB%A6%AC/

    반응형
    • 네이버 블러그 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 구글 플러스 공유하기
    • 카카오톡 공유하기