본문 바로가기
객체 지향 프로그래밍/디자인 패턴

[생성 패턴] 팩토리 메서드 패턴 (Factory Method Pattern) 이란?

by xangmin 2022. 5. 26.
반응형

팩토리 메서드 패턴 이란?

객체를 생성할 때, 어떤 클래스의 인스턴스를 만들지 서브 클래스에서 결정하는 디자인 패턴

여러 개의 서브 클래스를 가진 슈퍼 클래스가 있을 때, 인풋에 따라 하나의 자식 클래스의 인스턴스를 리턴

다양한 구현체 (Product)가 있고, 그 중에서 특정한 구현체를 만들 수 있는 다양한 팩토리(Creator)를 제공

Creator Product 타입의 객체를 반환하는 팩토리 메서드를 선언하는 클래스
팩토리 메서드를 기본적으로 구현, ConcreteProduct 객체를 반환
ConcreteCreator 팩토리 메서드를 재정의하여 ConcreteProduct의 인스턴스를 반환
Product 팩토리 메서드가 생성하는 객체의 인터페이스 정의
ConcreteProduct Product 클래스에 정의된 인터페이스를 실제로 구현하는 클래스

 

장점

기존 코드(인스턴스 만드는 과정)를 수정하지 않고새로운 인스턴스를 다른 방법으로 생성하도록 확장할 수 있다.

 - Product와 Creator 간의 결합도가 낮다.

 - 확장에 열려있고 변경에 닫혀있는 OCP 적용

 

단점

클래스가 많아질 수 있다.

 - 제품 클래스가 바뀔 때 마다 새로운 서브 클래스를 생성해야 한다.

클라이언트가 Creator 클래스를 반드시 상속해 Product를 생성해야 한다.

 

Super Class

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();
    }
}

 

Sub Class 1

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;
    }
}

 

Sub Class 2

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;
    }
}

 

Factory Class

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;
    }
}

 

Test Class

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
반응형

댓글