EEALL@ONCE

☕ "팩토리 패턴(Factory Pattern)" : 예제 본문

언어💻/자바☕

☕ "팩토리 패턴(Factory Pattern)" : 예제

올엣원스 2024. 1. 3. 20:31
728x90

팩토리 패턴을 사용하고, 하나의 public 클래스와 여러 개의 패키지 수준의 클래스가 있는 예제를 만들어 드리겠습니다. 이 예제에서는 간단한 차량 객체를 생성하는 팩토리 패턴을 사용해 보겠습니다.

package vehicle;

// 공개된 팩토리 클래스
public class VehicleFactory {

    // 팩토리 메소드: 차량 타입에 따라 해당하는 차량 객체를 생성
    public static Vehicle createVehicle(String type) {
        switch (type) {
            case "car":
                return new Car();
            case "truck":
                return new Truck();
            case "motorcycle":
                return new Motorcycle();
            default:
                throw new IllegalArgumentException("Unknown vehicle type: " + type);
        }
    }

    // Vehicle 인터페이스: 모든 차량 클래스가 구현할 인터페이스
    public interface Vehicle {
        void drive();
    }

    // Car 클래스: Vehicle 인터페이스 구현
    static class Car implements Vehicle {
        @Override
        public void drive() {
            System.out.println("Driving a car");
        }
    }

    // Truck 클래스: Vehicle 인터페이스 구현
    static class Truck implements Vehicle {
        @Override
        public void drive() {
            System.out.println("Driving a truck");
        }
    }

    // Motorcycle 클래스: Vehicle 인터페이스 구현
    static class Motorcycle implements Vehicle {
        @Override
        public void drive() {
            System.out.println("Driving a motorcycle");
        }
    }
}

이 코드는 VehicleFactory라는 public 클래스와 Car, Truck, Motorcycle라는 세 개의 패키지 수준 클래스(static 클래스)를 포함하고 있습니다. VehicleFactory 클래스 내에는 createVehicle이라는 정적 팩토리 메소드가 있으며, 이 메소드는 문자열 타입에 따라 적절한 차량 객체를 생성합니다. 각 차량 클래스는 Vehicle 인터페이스를 구현하여 drive 메소드를 정의합니다.

이 예제에서, VehicleFactory는 차량 객체의 생성을 중앙화하고 관리합니다. 이를 통해, 클라이언트 코드는 구체적인 차량 클래스에 의존하지 않고, Vehicle 인터페이스를 통해 차량 객체와 상호작용할 수 있습니다. 이러한 방식은 코드의 유연성과 확장성을 높이며, 객체 생성 로직을 한 곳에서 관리할 수 있게 해줍니다.

 


. 내부 클래스를 사용하는 방식으로 팩토리 패턴을 구현한 예제를 만들어 드리겠습니다. 이 예제에서는 여전히 차량 객체를 생성하지만, 이번에는 내부 클래스를 사용하여 각 차량 타입을 구현하겠습니다.

package vehicle;

// VehicleFactory 클래스: 차량 객체를 생성하는 팩토리 클래스
public class VehicleFactory {

    // Vehicle 인터페이스: 모든 차량 클래스가 구현할 인터페이스
    public interface Vehicle {
        void drive();
    }

    // 팩토리 메소드: 차량 타입에 따라 해당하는 차량 객체를 생성
    public static Vehicle createVehicle(String type) {
        switch (type) {
            case "car":
                return new VehicleFactory().new Car();
            case "truck":
                return new VehicleFactory().new Truck();
            case "motorcycle":
                return new VehicleFactory().new Motorcycle();
            default:
                throw new IllegalArgumentException("Unknown vehicle type: " + type);
        }
    }

    // Car 클래스: 내부 클래스로 Vehicle 인터페이스 구현
    public class Car implements Vehicle {
        @Override
        public void drive() {
            System.out.println("Driving a car");
        }
    }

    // Truck 클래스: 내부 클래스로 Vehicle 인터페이스 구현
    public class Truck implements Vehicle {
        @Override
        public void drive() {
            System.out.println("Driving a truck");
        }
    }

    // Motorcycle 클래스: 내부 클래스로 Vehicle 인터페이스 구현
    public class Motorcycle implements Vehicle {
        @Override
        public void drive() {
            System.out.println("Driving a motorcycle");
        }
    }
}
728x90