EEALL@ONCE
☕ "팩토리 패턴(Factory Pattern)" : 예제 본문
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
'언어💻 > 자바☕' 카테고리의 다른 글
☕인터페이스에 `static` 메서드와 `default` 메서드 : java 8 이후 (0) | 2023.12.01 |
---|---|
☕Java 스트림과 Collectors의 groupingBy 및 reducing 메서드 (1) | 2023.11.29 |
☕Collectors : 유틸리티 클래스 (java stream api) 컬렉션 연산 수행자 (0) | 2023.11.29 |
☕ 추상클래스와 인터페이스의 차이는 뭘까? (1) | 2023.11.27 |
☕ FUNCTIONAL INTERFACE : @FunctionalInterface (0) | 2023.11.20 |