2021.11.21_추상팩토리패턴04.자바와스프링에서찾아보는패턴
본문 바로가기
CS Study/디자인패턴

2021.11.21_추상팩토리패턴04.자바와스프링에서찾아보는패턴

by KyeongMin 2021. 11. 21.
728x90
반응형

추상팩토리 패턴 실무에서 사용

public class DocumentBuilderFactoryExample{
    public static void main(String[] args) throws ParserConfigurationException, IOException, SAXException{
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document document = builder.parse(new File("src/main/resources/config.xml"));
        System.out.println(document.getDocumentElement());
    }
}
  • DocumentBuilderFactory 자바 x 파서에 있음
  • 이 자체가 추상팩토리라고 볼 수 있음
  • DocumentBuilder의 추상적인 메소드를 통해서 작업만 하면됨
    • 초점을 클라이언트 입장에두는 것
  • 자바의 라이브러리에서는
    • javax.xml.xpath.XPathFactory#newInstance()
    • javax.xml.transform.TransformerFactory#newInstance()
    • javax.xml.parsers.DocumentBuilderFactory#newInstance()
  • 스프링
    • FactoryBean과 그 구현체
    • 스프링이 제공하는 인터페이스
  • new로는 만들 수 없고 복잡한 과정을 거칠때 함
<bean id ="hello" class ="java.lang.String">
    <constructor-arg value="hello"/>
</bean>
  • 이렇게 쉽게 만들 수 있었는데
  • 팩토리 빈을 쓰는 경우 만드는 법이 복잡한 경우는 팩토리빈을 직접 구현해서 사용
public class ShipFactory implements FactoryBean<Ship>{
 @Override
    public Ship getObject() throws Exception{
        Ship ship = new Whiteship();
        ship.setName("whiteship");
        return ship;
    }
 @Override
    public Class<?> getObjectType(){return Ship.class;}
}
  • 이 클래스를 빈으로 등록하면 이 팩토리가 빈으로 등록되서 가능하게됨
    • public interface FactoryBean의 경우는 추상팩토리인터페이스에 해당
    • 위의 구현해서 제공한 것은 추상적인 팩토리 인터페이스의 구현체가 되는 것
  • 클라이언트에서 사용하는 것은 스프링 내부에 존재함

사용하기

config.xml

<bean id = "whiteship" class="ShipFactory"/>
  • 빈에 등록을 함
  • 실제로 가져올때는 ship으로 가져올 수 있음
public class FactoryExample{
    public static void main(String[] args){
		ApplicationContext applicationContext = new ClasPathApplicationContext("config.xml");
        Ship whiteship = applicationContext.getBean("whiteship",Ship.class);
        System.out.println(whiteship.getName());
    }
}
  • ShipFactory로 등록했지만 Ship으로 가져옴

자바설정 빈 만들기

public class FactoryBeanConfig{
    @Bean
    public ShipFactory shipFactory(){
        return new ShipFactory();
    }
}

자바로 설정시 두가지 방법 사용

public class FactoryExample{
    public static void main(String[] args){
		ApplicationContext applicationContext = new ClasPathApplicationContext(FactoryBeanConfig.class);
        ShipFactory bean = applicationContext.getBean(ShipFactory.class);
        System.out.println(bean);
    }
}
public class FactoryExample{
    public static void main(String[] args){
		ApplicationContext applicationContext = new ClasPathApplicationContext(FactoryBeanConfig.class);
        Ship bean = applicationContext.getBean(Ship.class);
        System.out.println(bean);
    }
}
  • ShipFactory 또는 Ship으로 가져올 수 있음

https://github.com/3DPIT/study/blob/master/05.%EC%BD%94%EB%94%A9%EC%9C%BC%EB%A1%9C%ED%95%99%EC%8A%B5%ED%95%98%EB%8A%94GoF%EC%9D%98%EB%94%94%EC%9E%90%EC%9D%B8%ED%8C%A8%ED%84%B4/01.%EA%B0%9D%EC%B2%B4%EC%83%9D%EC%84%B1%EA%B4%80%EB%A0%A8%EB%94%94%EC%9E%90%EC%9D%B8%ED%8C%A8%ED%84%B4/2021/11/1121/%EC%B6%94%EC%83%81%ED%8C%A9%ED%86%A0%EB%A6%AC%ED%8C%A8%ED%84%B4/04.%EC%9E%90%EB%B0%94%EC%99%80%EC%8A%A4%ED%94%84%EB%A7%81%EC%97%90%EC%84%9C%EC%B0%BE%EC%95%84%EB%B3%B4%EB%8A%94%ED%8C%A8%ED%84%B4/2021.11.21_04.%EC%9E%90%EB%B0%94%EC%99%80%EC%8A%A4%ED%94%84%EB%A7%81%EC%97%90%EC%84%9C%EC%B0%BE%EC%95%84%EB%B3%B4%EB%8A%94%ED%8C%A8%ED%84%B4.md

 

GitHub - 3DPIT/study

Contribute to 3DPIT/study development by creating an account on GitHub.

github.com

 

728x90
반응형

댓글