생성자를 통한 객체생성은 간편한 객체생성을 보장한다.
new Object()
의 형태로 손쉽게 객체를 생성할 수 있고, 자바 문법에서 가장 기초적인 방법이기도 하다.
그러나 객체생성의 수단으로 생성자가 노출된다는 말은 무분별한 객체생성을 제어할 수 없다는 말이기도 하다.
또한, 생성자는 형태가 정해져있기에 호출시점에서 의미를 부여하기에 부적절하다.
이러한 단점을 극복하기 위해서는 메서드와 private
생성자를 이용하면 된다.
즉, 외부에 메서드를 노출시키고 메서드 내에서 생성자를 호출하여 객체를 반환하는 것이다.
이렇게되면 객체생성의 제어권을 클래스가 소유하게 되므로 손쉽게 객체생성을 제어할 수 있고, 메서드 명칭을 통해 호출시점에 의미를 부여 할 수 있게된다. 이러한 객체생성 구조를 팩토리 메서드 패턴이라고 부른다.
클래스 구조도를 살펴보면 Creator
의 createProduct()
호출을 통해 Product
객체를 얻어내는 구조를 띄고있다.
즉, Product
의 정적 메서드를 이용하는 정적 팩토리 메서드가 아니라 외부의 Creator
클래스를 통해 Product
객체를 얻어내는 구조를 띄고있다.
이 방법은 Product
의 하위 클래스에 매칭되는 Creator
하위클래스 구현을 통해 특정 타입의 객체를 생성해낼 수 있게한다.
예를들어, Creator
가 CreaterA
타입이라면 ProductA
를 생성해내는 것이다.
즉, Creator
와 Product
사이의 느슨한 결합을 통해 생성되는 객체를 유연하게 변경할 수 있다는 의미가 된다.
하위클래스를 통해 객체생성 로직을 새롭게 정의할 수 있기때문에 객체생성 방식을 유연하게 변경할 수 있는 장점이 있다.
새로운 방식의 객체생성을 원한다면 새로운 하위 클래스를 생성하면 되기 때문이다.
다만, 하위클래스의 개수가 너무 많아지면 복잡도가 증가하기 때문에 적정선을 유지해야한다.
추상팩토리는 팩토리 메서드 패턴에 기초를 두고 있으나, 일관된 객체 생성방법을 제공하는데 목적을 두고 있다.
즉, 특정 형태나 개념을 단위로 Factory
클래스를 구성하고 그에 맞는 객체생성 방법을 관리하는 것이다.
클래스 구조도를 살펴보면 팩토리 메서드 패턴과 유사하게 별도의 팩토리 클래스에서 객체생성을 담당하는 모습이 보인다.
다만, 다수의 객체를 형태나 개념 단위로 묶어서 하위클래스로 구현해내는 것이 차이점이다.
즉, Factory1
와 Factory2
는 각각 자신이 담당하는 형태나 개념에 적절한 형태로 팩토리 메서드를 구현한다.
이를통해 클라이언트는 상황에 적절한 팩토리 클래스를 선택함으로써, 원하는 객체를 손쉽게 획득할 수 있다.
클라이언트에게 일관성있는 생성방법을 보장하는 것이 특징이다.
자신의 상황에 맞는 팩토리클래스를 선택하기만 하면 생성되는 객체의 타입을 손쉽게 변경할 수 있다.