개념
: 객체를 생성하는 인터페이스를 제공하여 객체의 생성 과정을 캡슐화하는 방법입니다.
즉, 팩토리 메소드 패턴에서는 객체를 생성하기 위한 인터페이스를 정의하는데, 어떤 클래스의 인스턴스를 만들지는 서브 클래스에서 결정하게 만드는 패턴이다.
객체 지향 디자인 패턴의 확장에 있어서는 열려 있어야 하며, 수정에 있어서는 닫혀 있어야 한다는 것이다. (OCP, Open Closed Principle)
여기서 수정에 있어서 닫혀 있어야 한다는 말에 주목 해보자. 코드를 수정하지 않아도 모듈의 기능을 확장하거나 변경 할 수 있어야 한다. 때문에, 수정이 일어날 가능성이 큰 부분과 그렇지 않은 부분을 분리하는 것이 좋다.
객체는 속성과 함수가 변경, 또는 추가 될 수 있다. 이에 따라 객체의 생성을 담당하는 코드는 변경의 가능성이 높다. 객체의 생성을 담당하는 클래스를 한 곳에서 관리하여 결합도를 줄이기 위하여 팩토리 패턴이 나타나게 된 것이다.
결합도 개념
: 한 클래스에 변경점이 얼마나 다른 클래스에 영향을 주는가를 의미한다.
class Product {
init() {}
}
class User {
let p = Product()
}
두 개의 클래스가 있다. 하나는 Product클래스 이고, 다른 하나는 Product를 사용하는 User클래스이다.
이때 Product와 User의 관계를 의존 관계라고 한다. 의존의 대상인 Product 클래스가 사라지면, User 클래스는 컴파일이 불가능해지고, 동작할 수 없게 된다.
팩토리 클래스에서는 getInstance()
메소드를 이용하여 인스턴스를 반환한다. 이제, User 클래스 내부에서는 Product 객체를 직접 생성하지 않는다. 팩토리 클래스에 인스턴스를 요청하고, 생성된 인스턴스를 반환받으면 된다.(객체의 생성을 위임했다고 말 할 수 있다.)
만약 Product의 생성자가 변경 된다면??
Factory에 getInstance() 메소드 내부에 있는 Product 생성자만 변경 시켜주면 된다.