본문 바로가기

DEV

Design Patterns - 2. Factory Method Pattern

 

예제는 『Java Design Patterns A Tour of 23 Gang of Four Design Patterns in Java』 (Apress, 2016) 에서 가지고 옴

 

추상클래스가 객체 생성을 정의하지만, 객체 생성은 하위 서브클래스가 결정하는 구조.

 

JDK에서 사용된 예 - SocketFactory

https://docs.oracle.com/javase/8/docs/api/index.html?javax/net/SocketFactory.html

 

■ UML Class Diagram 

IAnimalFactory : Animal 생성을 정의한 추상 클래스

ConcreteFactory : 객체 생성 담당, IAnimalFactory의 구현(하위) 클래스, AnimalType을 인자로 받아서 객체를 생성한다

IAnimal : Animal 정의 인터페이스

Duck, Tiger : IAnimal 구현한 클래스

Animal을 사용하는 입장에서는 어떤 타입의 Animal이 리턴되더라도 IAnimal 인터페이스를 구현하였으므로 speak() 메서드가 실행된다. 유연성을 부여한 클래스 구조

 

 



■ Code Snippet

 

abstract class IAnimalFactory
{
    public abstract IAnimal GetAnimalType(String type) throws Exception; //if we cannot instantiate later we'll throw exception
}


class ConcreteFactory extends IAnimalFactory
{
    @Override
    public IAnimal GetAnimalType(String type) throws Exception
    {
        switch (type)
        {
            case "Duck":
                return new Duck();
            case "Tiger":
                return new Tiger();
            default:
                throw new Exception( "Animal type : "+type+" cannot be instantiated");
        }
    }
}


class FactoryPatternEx
{
    public static void main(String[] args) throws Exception
    {
        System.out.println("***Factory Pattern Demo***\n");
        IAnimalFactory animalFactory = new ConcreteFactory();

        IAnimal DuckType=animalFactory.GetAnimalType("Duck");
        DuckType.Speak();

        IAnimal TigerType = animalFactory.GetAnimalType("Tiger");
        TigerType.Speak();


        //There is no Lion type. So, an exception will be thrown
        IAnimal LionType = animalFactory.GetAnimalType("Lion");
        LionType.Speak();
    }
}

 

√ 실행 결과


■ 정리

1) 객체 생성을 하위 클래스로 옮길 때 유용하다

2) 병렬 클래스 계층을 구현할 때 또는 느슨한 결합인 시스템을 만들 때 유용하다.

3) 너무 많은 객체를 만들면 성능이 저하될 수 있다.

 

 

※ 참고 자료

1) 『Java Design Patterns A Tour of 23 Gang of Four Design Patterns in Java』 (Apress, 2016)

2) Example Source
https://github.com/apress/java-design-patterns

 

 

'DEV' 카테고리의 다른 글

Design Patterns - 4. Adapter Pattern  (0) 2021.10.24
Design Patterns - 3. Singleton Pattern  (0) 2021.10.06
Design Patterns - 1. 디자인 패턴이란  (0) 2021.10.06
Scouter - 설치  (0) 2021.09.28
GitLab - 프로젝트에 멤버 추가하기  (0) 2020.04.14