Java 팩토리 패턴 구현 방법

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();
    }
}

태그: java 팩토리 패턴 추상 팩토리 스프링 빈

5월 29일 11:17에 게시됨