1. 기본 팩토리 패턴
목적: 다양한 유형의 객체 생성 과정을 표준화
구현 예시:
Transport 인터페이스:
package designpattern.factory;
public interface Transport {
void move();
}
Bus 구현체:
package designpattern.factory;
public class Bus implements Transport {
@Override
public void move() {
System.out.println("버스 이동 중...");
}
}
Train 구현체:
package designpattern.factory;
public class Train implements Transport {
@Override
public void move() {
System.out.println("기차 운행 중...");
}
}
추상 팩토리 클래스:
package designpattern.factory;
public abstract class TransportFactory {
public abstract Transport create();
}
Bus 전용 팩토리:
package designpattern.factory;
public class BusFactory extends TransportFactory {
@Override
public Transport create() {
return new Bus();
}
}
사용 예시:
public class Client {
public static void main(String[] args) {
TransportFactory factory = new BusFactory();
Transport t = factory.create();
t.move();
}
}
인터페이스 vs 추상 클래스 선택 기준:
- 실제 존재하는 개념은 추상 클래스로 구현
- 객체의 특성(이동 가능, 주행 가능 등)은 인터페이스로 정의
- 유연성이 필요한 경우 인터페이스 우선 적용
2. 추상 팩토리 패턴
목적: 연관된 객체 군을 동시 생성 및 교체
제품군 구성:
// 가구 인터페이스
public interface Furniture {
void assemble();
}
// 조명 인터페이스
public interface Lighting {
void turnOn();
}
// 가전제품 인터페이스
public interface Appliance {
void powerOn();
}
현대식 제품 구현:
public class ModernChair implements Furniture {
public void assemble() {
System.out.println("모던 의자 조립");
}
}
public class LEDLight implements Lighting {
public void turnOn() {
System.out.println("LED 조명 켜짐");
}
}
추상 팩토리:
public abstract class HomeFactory {
public abstract Furniture createFurniture();
public abstract Lighting createLighting();
public abstract Appliance createAppliance();
}
현대식 홈 팩토리:
public class ModernHomeFactory extends HomeFactory {
@Override
public Furniture createFurniture() {
return new ModernChair();
}
@Override
public Lighting createLighting() {
return new LEDLight();
}
@Override
public Appliance createAppliance() {
return new SmartTV();
}
}
장점:
- 전체 제품군을 구성 파일 변경만으로 교체 가능
- 새로운 스타일 추가 시 기존 코드 수정 최소화
3. 스프링 빈 팩토리
의존성 주입 시뮬레이션:
빈 팩토리 인터페이스:
public interface BeanContainer {
Object getBean(String id);
}
XML 설정 리더:
public class XmlBeanLoader implements BeanContainer {
private Map<String, Object> beans = new HashMap<>();
public XmlBeanLoader(String config) throws Exception {
// XML 파싱 로직
Element root = parseXml(config);
List<Element> elements = root.getChildren("bean");
for (Element el : elements) {
String id = el.getAttributeValue("id");
String className = el.getAttributeValue("class");
Object instance = Class.forName(className).newInstance();
beans.put(id, instance);
}
}
@Override
public Object getBean(String id) {
return beans.get(id);
}
}
설정 파일 (home.xml):
<beans> <bean id="vehicle" class="com.example.Bicycle"/> </beans>
사용 예시:
public class Application {
public static void main(String[] args) throws Exception {
BeanContainer container = new XmlBeanLoader("home.xml");
Transport t = (Transport) container.getBean("vehicle");
t.move();
}
}