팩토리 패턴
2020-02-06
팩토리 패턴
팩토리 패턴은은 여러 개의 자식 클래스를 갖는 부모 클래스가 있고, 입력에 따라 자식클래스 중 하나를 반환해야 할 때 사용됩니다.
첫번 째로 팩토리 패턴을 어떻게 구현하는지와 이 패턴의 장점을 알아보겠습니다. JDK에서 팩토리 패턴을 사용한 사례들이 몇개 있습니다. 팩토리 패턴은 팩토리 메소드 패턴으로도 알려져있습니다.
팩토리 패턴의 부모 클래스
팩토리 패턴의 부모 클래스는 인터페이스나, 추상클래스 또는 그냥 클래스일 수 있습니다. 이번 예제에서는 추상 부모클래스를 이용해보겠습니다.
테스트를 위해서 toString()을 오버라이드 했습니다.
public abstract class Computer {
public abstract String getRAM();
public abstract String getHDD();
public abstract String getCPU();
@Override
public String toString(){
return "RAM= "+this.getRAM()+", HDD="+this.getHDD()+", CPU="+this.getCPU();
}
}
팩토리 패턴 자식 클래스
PC와 Server 자식 클래스가 있다고 가정해봅시다.
public class PC extends Computer {
private String ram;
private String hdd;
private String cpu;
public PC(String ram, String hdd, String cpu){
this.ram=ram;
this.hdd=hdd;
this.cpu=cpu;
}
@Override
public String getRAM() {
return this.ram;
}
@Override
public String getHDD() {
return this.hdd;
}
@Override
public String getCPU() {
return this.cpu;
}
}
위 아래 클래스 모두 Computer 클래스를 상속했습니다.
public class Server extends Computer {
private String ram;
private String hdd;
private String cpu;
public Server(String ram, String hdd, String cpu){
this.ram=ram;
this.hdd=hdd;
this.cpu=cpu;
}
@Override
public String getRAM() {
return this.ram;
}
@Override
public String getHDD() {
return this.hdd;
}
@Override
public String getCPU() {
return this.cpu;
}
}
팩토리 클래스
이제 부모클래스와 자식클래스를 준비했으니 팩토리 클래스를 구현하겠습니다.
public class ComputerFactory {
public static Computer getComputer(String type, String ram, String hdd, String cpu){
if("PC".equalsIgnoreCase(type)) return new PC(ram, hdd, cpu);
else if("Server".equalsIgnoreCase(type)) return new Server(ram, hdd, cpu);
return null;
}
}
팩토리 패턴의 중요한 포인트는 다음과 같습니다.
- 팩토리 클래스를 싱글톤이나 static으로 자식클래스를 리턴하는 걸 가지고 있어야 합니다.
- 입력 파라미터에 따라 각각의 다른 자식클래스들이 리턴됩니다.
getComputer
메소드는 팩토리 메소드 입니다.
테스트
다음은 팩토리 클래스를 테스트하는 코드 입니다.
public class TestFactory {
public static void main(String[] args) {
Computer pc = ComputerFactory.getComputer("pc","2 GB","500 GB","2.4 GHz");
Computer server = ComputerFactory.getComputer("server","16 GB","1 TB","2.9 GHz");
System.out.println("Factory PC Config::"+pc);
System.out.println("Factory Server Config::"+server);
}
}
결과
Factory PC Config::RAM= 2 GB, HDD=500 GB, CPU=2.4 GHz
Factory Server Config::RAM= 16 GB, HDD=1 TB, CPU=2.9 GHz
팩토리 패턴의 장점
- 팩토리 패턴은 인터페이스에 대한 접근 방식을 제공합니다.
- 팩토리 패턴은 실제 구현 클래스의 인스턴스를 제거하여 의존성을 제거하고 확장하기 쉽게 만듭니다. 예를 들어 PC 클래스 구현을 쉽게 변경할 수 있습니다.
- 팩토리 패턴은 상속을 통해 클래스 간의 추상화를 제공합니다.
JDK에서 팩토리 패턴 사용 사례
- java.util.Canlendar , Resource , NumberFormat 클래스 들의
getInstance()
메소드들이 팩토리 패턴을 사용합니다. - Boolean 이나 Integer등 wrapper 클래스에 있는
valueOf()
메소드가 사용합니다.