[디자인 패턴] 팩토리 메서드 패턴 (Factory Method Pattern)

최진민·2021년 11월 21일
0

디자인 패턴

목록 보기
10/10
post-thumbnail
  • 정의
  • 사용 이유
  • 구현

🦀 1. 팩토리 메서드 패턴 ?

  • 팩토리 메서드 패턴 (Factory Method Pattern)
    • 객체를 만들어내는 부분을 서브 클래스에게 위임
    • 즉, new 로 객체를 생성하는 것을 서브 클래스에 위임. = 객체를 만들어내는 공장(Factory 객체)을 만드는 패턴

🦛 2. 사용 이유

  • 자동차를 생산하는 과정

    public interface Car {
        void getName();
    }
    public class KingCar implements Car {
        @Override
        public void getName() {
            System.out.println("King Car.");
        }
    }
    public class QueenCar implements Car {
        @Override
        public void getName() {
            System.out.println("Queen Car.");
        }
    }
    public class FactoryA {
        public Car makeCar(String carName){
            Car car = null;
    
            switch (carName) {
                case "king":
                    car = new KingCar();
                    break;
                case "queen":
                    car = new QueenCar();
                    break;
            }
    
            return car;
        }
    }
    public class FactoryB {
        public Car makeCar(String carName){
            Car car = null;
    
            switch (carName) {
                case "king":
                    car = new KingCar();
                    break;
                case "queen":
                    car = new QueenCar();
                    break;
            }
    
            return car;
        }
    }
    public class NonClient {
        public static void main(String[] args) {
            FactoryA a = new FactoryA();
            FactoryB b = new FactoryB();
    
            a.makeCar("king").getName();
            a.makeCar("queen").getName();
    
            b.makeCar("king").getName();
            b.makeCar("queen").getName();
        }
    }
    
    print >>>
    King Car.
    Queen Car.
    King Car.
    Queen Car.
  • 팩토리가 많아질수록 switch 구문이 중복되어 사용될 수 있다. 즉, 객체 생성은 객체 간의 결합도를 증가시키며, 동시에 유지보수가 어려워진다.

    • 하나의 팩토리를 통해 결합도를 낮춰야 한다.

🐓 3. 구현

  • 팩토리 메서드 패턴을 사용하여 결합도를 낮추고 유지보수에 용이하도록 변경 (Car, KingCar, QueenCar는 변경 X)

    public class CarFactory {
        public Car makeCar(String name) {
            /*try {
                Class<?> cls = Class.forName(className);
                return (Car) cls.newInstance();
            } catch (Exception e) {
                return null;
            }*/
    
            Car car = null;
    
            switch (name) {
                case "king":
                    car = new KingCar();
                    break;
                case "queen":
                    car = new QueenCar();
                    break;
            }
    
            return car;
        }
    }
    public class A {
        public Car makeCar(String name) {
            CarFactory carFactory = new CarFactory();
            Car car = carFactory.makeCar(name);
            return car;
        }
    }
    public class B {
        public Car makeCar(String name) {
            CarFactory carFactory = new CarFactory();
            Car car = carFactory.makeCar(name);
            return car;
        }
    }
    public class AdaptClient {
        public static void main(String[] args) {
            A a = new A();
            B b = new B();
    
            a.makeCar("king").getName();
            a.makeCar("queen").getName();
    
            b.makeCar("king").getName();
            b.makeCar("queen").getName();
        }
    }
    
    print >>>
    King Car.
    Queen Car.
    King Car.
    Queen Car.
    • (참고) /*...*/클래스 이름을 통해 반환
    • A, B, ... 등 CarFactory를 통해 차를 생산하면 중복되는 코드(switch)가 없고, 결합도를 낮춰 유지보수가 더욱 용이해진다.
profile
열심히 해보자9999

0개의 댓글