ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Factory Method Pattern(팩토리 메서드 패턴)
    STUDY/디자인패턴 2024. 10. 29. 19:48

    팩토리 메서드 패턴이란?

    객체 생성을 공장 클래스로 캡슐화 처리하여 대신 생성하게 하는 생성 디자인 패턴이다.

     

     클라이언트에서 직접 new 연산자를 통해 제품 객체를 생성하는 것이 아닌, 제품 객체들을 도맡아 생성하는 공장 클래스를 만들고, 이를 상속하는 서브 공장 클래스의 메서드에서 여러가지 제품 객체 생성을 각각 책임지는 패턴이다.

     

    즉, 부모 공장 클래스는 제품 인터페이스에만 의존하고 실제로 어떤 제품 구현 클래스를 생성할 지는 서브 공장 클래스에서 결정한다. 즉, 인스턴스 생성을 서브 공장 클래스에게 위임하는 것이다.

     

    구조

     

    Product : 팩토리 메서드로 생성될 객체의 공통 인터페이스

    ConcreteProduct : 인터페이스를 구현한 클래스

    Creator : 추상화 팩토리 메서드를 갖는 클래스

    ConcreteCreator : 팩터리 메서드를 구현하는 클래스로 ConcreteProduct 객체를 생성한다.

     

     

    [제품 클래스]

    public interface Product {
        void setting();
    }
    
    
    public class ConcreteProductA implements Product {
        @Override
        public void setting() {
            System.out.println("A");
        }
    }
    
    
    public class ConcreteProductB implements Product {
        @Override
        public void setting() {
            System.out.println("B");
        }
    }

     

     

    [생산자 클래스]

    public abstract class AbstractFactory {
        public final Product someOperation() {
            Product product = createProduct();
            product.setting();
    
            return product;
        }
    
        // 팩터리 메서드
        abstract protected Product createProduct();
    }
    
    
    public class ConcreteFactoryA extends AbstractFactory {
        @Override
        protected Product createProduct() {
            return new ConcreteProductA();
        }
    }
    
    
    public class ConcreteFactoryB extends AbstractFactory {
        @Override
        protected Product createProduct() {
            return new ConcreteProductB();
        }
    }

     

     

    [클라이언트]

    public class Client {
        public static void main(String[] args) {
            AbstractFactory[] factory = {
                    new ConcreteFactoryA(),
                    new ConcreteFactoryB()
            };
    
            Product productA = factory[0].someOperation();
            Product productB = factory[1].someOperation();
        }
    }

     

     

    장단점

    장점

    • 결합도를 낮추고 유지보수가 용이하다.
    • 객체를 한 곳에서 생성하기 때문에, 유지관리가 쉽다.(단일 책임 원칙)
    • 인터페이스/추상클래스로 구현되기 때문에 유연하고 확정성 있는 구조이다.(개방/폐쇄 원칙)

    단점

    • 새로운 하위클래스를 계속 정의하게 되면 구조가 복잡해질 수 있다.
Designed by Tistory.