팩토리(factory) 패턴이란?

쓰리원·2022년 5월 28일
0

디자인패턴

목록 보기
2/4
post-thumbnail

선수 지식 : 객체-지향의-강한-결합과-약한-결합이란

1. 팩토리(factory) 패턴이란?

객체 지향의 5원칙 SOLID에서 개방 폐쇄 원칙(OCP, Open Closed Principle) 확장에 있어서는 열려 있어야 하며, 수정에 있어서는 닫혀 있어야 한다는 것 입니다.

팩토리 패턴은 위의 개방 폐쇄 원칙을 달성 할 수 있게 해줍니다. 즉, 클래스 내부 코드를 직접적으로 수정하지 않아도 모듈의 기능을 확장하거나 변경 할 수 있게 합니다. 그래서, 수정이 일어날 가능성이 큰 부분과 그렇지 않은 부분을 분리해 줍니다.

팩토리 패턴은 클라이언트가 특정 객체의 생성을 직접 생성하지 않고 생성 역할을 하는 클래스를 만들어 그 클래스에게 위임합니다. 그리고 객체의 생성을 담당하는 클래스를 한 곳에서 관리하여 응집도를 높여서 단일 책임 원칙(Single responsibility principle) : SRP의 원칙대로 설계합니다.

  • 팩토리는 인터페이스로 추상화하여 구체 팩토리의 변경을 유연하게 합니다.

  • 구체 팩토리는 추상화된 객체를 생성합니다. 이는 클라이언트와의 결합을 낮추고, 생성 객체의 확장성과 변경 용이를 보장합니다.

  • 클라이언트는 결과적으로 어떤 객체가 생성될 것인지 알 필요가 없습니다.

2. 팩토리 패턴을 적용하지 않은 경우

아래의 Toy클래스들은 NomalBattary에 의존하고 있습니다.

public class NomalBattary {
    public void Use() {
        System.out.println("일반배터리를 사용합니다.");
    }
}

public class ToyA {
    private NomalBattary nomalbattary;
    
    public ToyA() {
        this.nomalbattary = new NomalBattary();
    }

    public void Toystart() {
        nomalbattary.Use();
    }
}

public class ToyB {
    private NomalBattary nomalbattary;
    
    public ToyB() {
        this.nomalbattary = new NomalBattary();
    }

    public void Toystart() {
        nomalbattary.Use();
    }
}

public class ToyC {
    private NomalBattary nomalbattary;
    
    public ToyC() {
        this.nomalbattary = new NomalBattary();
    }

    public void Toystart() {
        nomalbattary.Use();
    }
}

여기서 NomalBattary클래스들의 생성자가 바뀐다고 가정하겠습니다. 그렇게 되면 모든 Toy클래스들의 안에 있는 모든 NomalBattary 클래스의 생성자를 변경해 주어야 합니다. 아래의 코드에서 확인해보겠습니다.

public class NomalBattary {

    public NomalBattary(String energe) {
    }
    
    public void Use() {
        System.out.println("일반배터리를 사용합니다.");
    }
}

public class ToyA {
    private NomalBattary nomalbattary;
    
    public ToyA() {
        this.nomalbattary = new NomalBattary("에너지");
    }

    public void Toystart() {
        nomalbattary.Use();
    }
}

public class ToyB {
    private NomalBattary nomalbattary;
    
    public ToyB() {
        this.nomalbattary = new NomalBattary("에너지");
    }

    public void Toystart() {
        nomalbattary.Use();
    }
}

public class ToyC {
    private NomalBattary nomalbattary;
    
    public ToyC() {
        this.nomalbattary = new NomalBattary("에너지");
    }

    public void Toystart() {
        nomalbattary.Use();
    }
}

NomalBattary에 종속된 모든 Toy클래스들을 일일이 변경해주는 것은 굉장히 비효율적이라는 것을 확인 할 수 있습니다.

3. 팩토리 패턴을 적용하는 경우

public class NomalBattaryFactory {
    public static NomalBattary getInstance() {
        return new NomalBattary();
    }
}

public class NomalBattary {

    public NomalBattary(String energe) {
    }
    
    public void Use() {
        System.out.println("일반배터리를 사용합니다.");
    }
}

public class ToyA {
    private NomalBattary nomalbattary;
    NomalBattaryFactory factory = new NomalBattaryFactory();
    
    public ToyA() {
        this.nomalbattary = factory.getInstance();
    }

    public void Toystart() {
        nomalbattary.Use();
    }
}

public class ToyB {
    private NomalBattary nomalbattary;
    NomalBattaryFactory factory = new NomalBattaryFactory();
    
    public ToyB() {
        this.nomalbattary = factory.getInstance();
    }

    public void Toystart() {
        nomalbattary.Use();
    }
}

public class ToyC {
    private NomalBattary nomalbattary;
    NomalBattaryFactory factory = new NomalBattaryFactory();
    
    public ToyC() {
        this.nomalbattary = factory.getInstance();
    }

    public void Toystart() {
        nomalbattary.Use();
    }
}

NomalBattaryFactory 클래스에서는 getInstance() 메서드를 통해 인스턴스를 반환합니다. 그러면 Toy클래스들 내부에서 NomalBattary 객체를 직접 생성하지 않습니다. NomalBattaryFactory 클래스에 인스턴스를 요청하고, 생성된 인스턴스를 반환받으면 됩니다.(객체의 생성을 위임)

NomalBattary의 생성자가 수정되게 된다면, NomalBattaryFactory에 getInstance() 메서드 내부에 있는 NomalBattary 생성자만 변경 시켜주면 됩니다.

4. reference

https://en.wikipedia.org/wiki/Factory_method_pattern
https://en.wikipedia.org/wiki/Abstract_factory_pattern
https://ko.wikipedia.org/wiki/%ED%8C%A9%ED%86%A0%EB%A6%AC_%EB%A9%94%EC%84%9C%EB%93%9C_%ED%8C%A8%ED%84%B4
https://western-sky.tistory.com/40

profile
가장 아름다운 정답은 서로의 협업안에 있다.

0개의 댓글