블링블링 범블링

팩토리 메서드 패턴(Factory Method Pattern) 본문

Technology/객체 지향 디자인 패턴

팩토리 메서드 패턴(Factory Method Pattern)

뻠스키 2018. 4. 18. 11:33

팩토리 메서드 패턴(Factory Method Pattern)




팩토리 메서드 패턴이란  생성객체를 생성하기 위한 인터페이스를 정의하는 데 어떤 클래스의 인스턴스를 생성여부는 서브 클래스에서 결정하는 패턴이다. 즉, 팩토리 메서드 패턴을 이용하면 클래스의 인스턴스를 만드는 일을 서브 클래스에게 위임하는 것이다.


팩토리 메서드가 객체 생성을 처리하며, 객체를 생성하는 코드를 캡슐화한다. 서브 클래스에서 어떤 클래스를 만들지 결정하므로써 객체 생성을 캡슐화한다. 이렇게 하면 슈퍼클래스에 있는 클라이언트 코드와 서브클래스에 있는 객체 생성 코드를 분리시킬 수 있다.


어떤 기능이 추가될지 미리 알 수 없는 경우에도 매우 유용하다. 기능이 추가되면 서브 클래스에서 만들고 팩토리 메소드를 구현하면 된다. 인터페이스를 바탕으로 유연성과 확장성이 뛰어난 코드 제작이 가능한 게 팩토리메서드의 장점이다. 하지만 인터페이스가 객체생성을 요청은서브클래스에서 인스턴스를 만들지는 결정한다는 점에서 템플릿메서드 패턴을 응용한 패턴이라고 할 수 있다.


예시를 통해서 팩토리메서드패턴을 이해해보자. 커피에는 바닐라커피, 모카커피, 아메리카노 등등 여러종류의 커피가 존재한다. 



코드로 표현하면 위의 클래스다이어그램으로 나타낼 수 있다. 추상클래스를 통해서 서브 클래스에서 상세구현을 해준 것이다. 여기서 팩토리클래스를 더 만들어서 본 클래스를 감춰준다.



[소스코드]


[Coffee Class : Product ]

1
2
3
public abstract class Coffee {
    public abstract String getName();
}

[VanillaCoffee Class : concreteProduct]

1
2
3
4
5
6
7
8
public class VanillaCoffee extends Coffee {
 
    @Override
    public String getName() {
        return "바닐라 커피";
    }
 
}

[MokaCoffee Class : concreteProduct]

1
2
3
4
5
6
7
8
public class MokaCoffee extends Coffee {
 
    @Override
    public String getName() {
        return "모카 커피";
    }
 
}

[CoffeeFactory Class : Creator ]

1
2
3
4
5
6
7
8
public abstract class CoffeeFactory {
    abstract Coffee createCoffee(String name);
     
     
    public void boilCoffee() {
        System.out.println("커피끓이기");
    }
}

[makeCoffeeFactory Class : contreteCreator ]

1
2
3
4
5
6
7
8
9
10
public class makeCoffeeFactory extends CoffeeFactory {
 
    @Override
    Coffee createCoffee(String name) {
        if(name=="바닐라") return new VanillaCoffee();
        else if(name=="모카")return new MokaCoffee();
        else return null;
    }
 
}
[coffeeClient Class : contreteCreator ]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class coffeeClient {
    public static void main(String[] args) {
         
        CoffeeFactory cf = new makeCoffeeFactory();
         
     
        Coffee vanilla = cf.createCoffee("바닐라");
        Coffee moka = cf.createCoffee("모카");
         
        cf.boilCoffee();
        System.out.println(vanilla.getName());
        System.out.println(moka.getName());
    }
}

 

coffeeClient 클래스를 보면 직접적으로 객체를 생성하지 않고 팩토리 메서드를 통해 위임한 결과를 볼 수 있다. 이렇게 팩토리 메서드 패턴을 사용하는 이유는 클래스 간의 결합도를 낮취기 위해서다. 클래스에 변경이 생겼을 때 다른 클래스 영향을 덜 주기 때문이다.


그리고 객체생성 코드를 전부 하나의 객체 또는 메소드에 구현하기 때문에 코드에 중복되는 내용을 제거할 수 있고, 수정에도 용이하다. 

클라이언트 입장에서는 객체 인스턴스를 만들 때 필요한 구상클래스가 아닌 인터페이스(추상메서드)만 필요로하게 된다. 인터페이스(추상메서드)를 바탕으로 프로그래밍한다는 것은 유연성과 확장성이 큰 코드를 짤 수 있다는 장점이 있다. 결론적으로는 추상화 된 것에 의존을 하고 구상클래스에 의존하지 않기 때문에 팩토리 메서드 패턴은 객체지향의 역전의존의 법칙에 부합한 패턴이라고 볼 수 있다.


출처 위키디피아 블로그_FactoryMethodPattern 블로그_FactoryMethodPattern

출처 : http://meylady.tistory.com/


Comments