패턴 적용 전에는 Customer 에서 직접 새로운 샌드위치 요소인 Beverage 와 Sidemenu 를 직접 생성해주었다.
패턴 적용 후에는 SandwichSidePartsFactory 를 통해 직접적으로 어떤 인스턴스가 생성되고 있는지를 숨겨주었다.
적용 전
public class Customer {
public static void main(String[] args) {
Sandwich sandwich = new Sandwich();
sandwich.setBeverage(new ColaBeverage());
sandwich.setSideMenu(new CookieSideMenu());
System.out.println(sandwich);
}
}
적용 후
public class BurgerKing {
public static void main(String[] args) {
Sandwich sandwich = new TunaSandwichFactory(new TunaSandwichSidePartsFactory()).createSandwich();
System.out.println(sandwich.getBeverage().getClass());
System.out.println(sandwich.getSideMenu().getClass());
}
}
3. 실제 사례
3-1. 자바
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());
}
}
3-2. 스프링
@Configuration
public class FactoryBeanConfig {
@Bean
public ShipFactory shipFactory() {
return new ShipFactory();
}
}
public class FactoryBeanExample {
public static void main(String[] args) {
// ApplicationContext applicationContext = new ClassPathXmlApplicationContext("config.xml");
// Ship whiteship = applicationContext.getBean("whiteship", Ship.class);
// System.out.println(whiteship.getName());
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(FactoryBeanConfig.class);
Ship bean = applicationContext.getBean(Ship.class);
System.out.println(bean);
}
}