디자인패턴) 팩토리 메소드 패턴 & 추상 팩토리 패턴 in Java
팩토리 메소드 패턴
- 팩토리 메소드 패턴은 객체지향 디자인 패턴, 생성과 관련된 패턴입니다.
- 부모클래스에 알려지지 않은 구체 클래스를 생성하는 패턴이며 자식클래스가 어떤 객체를 생성할지를 결정하도록 하는 패턴입니다.
- 객체를 만들어내는 부분을 서브클래스에 위임
- 직접 new연산자를 이용하여 객체를 생성하지 않고 팩토리 클래스에 위임.
디자인 패턴들의 공통점이라면 정의를 보고 바로 이해하기 어렵습니다...
예시를 보거나 따라해보는수 밖에....
public abstract class Soju { protected double proof; public abstract String introduce(); }public class Jinro extends Soju { public Jinro() { this.proof = 16.8; } @Override public String introduce() { // TODO Auto-generated method stub return "이것은 "+this.proof+"% 진로입니다."; } }public class Daejangbu extends Soju { public Daejangbu() { this.proof = 21; } @Override public String introduce() { // TODO Auto-generated method stub return "이것은 "+this.proof+"% 대장부입니다."; } }public class Chamisle extends Soju{ public Chamisle(){ this.proof = 16.9; } @Override public String introduce() { return "이것은 "+this.proof+"% 참이슬입니다."; } }
public class SojuFactory { public Soju getSoju(String name) { switch(name) { case "Jinro" : return new Jinro(); case "Chamisle" : return new Chamisle(); case "Daejangbu" : return new Daejangbu(); } return null; } }
public class main { public static void main(String[] args) { SojuFactory sf = new SojuFactory(); Soju jinro = sf.getSoju("Jinro"); Soju Daejangbu = sf.getSoju("Daejangbu"); System.out.println(jinro.introduce()); System.out.println(Daejangbu.introduce()); } }
결과.
추상 팩토리 패턴
- 서로 연관되거나 의존하는 객체들의 조합을 만드는 인터페이스를 제공하는 패턴입니다.
- 여러 연관된 다양한객체들을 하나의 특정 그룹으로 추상화하여 묶는 것입니다.
여기서 더 나아가 추상 팩토리 패턴을 구현해 봅시다.
소주만 있으니 섭섭해서 맥주 품목도 추가 하고 싶네요.
맥주 팩토리를 추가하면 팩토리가 여러개 존재 합니다.
여기서 팩토리들을 추상화 하여 상속받는 것으로 해보겠습니다.
위의 코드를 기반으로 맥주 인터페이스와 팩토리, 그리고 추상화된 팩토리를 추가 하겠습니다.
public interface Beer { public String introduce(); }public class Cloud implements Beer { @Override public String introduce() { // TODO Auto-generated method stub return "i'm Cloud"; } }public class Cass implements Beer { @Override public String introduce() { // TODO Auto-generated method stub return "I'm Cass"; } }public class Terra implements Beer { @Override public String introduce() { return "I'm Terra"; } }
팩토리를 추상화 하여 sojuFactory와 BeerFactory에게 상속합니다.
public abstract class AlcoholFactory { public abstract Beer getBeer(String name); public abstract Soju getSoju(String name); }public class BeerFactory extends AlcoholFactory { @Override public Beer getBeer(String name) { switch(name) { case "Terra" : return new Terra(); case "Cass" : return new Cass(); case "Cloud" : return new Cloud(); } return null; } @Override public Soju getSoju(String name) { return null; } }public class SojuFactory extends AlcoholFactory{ @Override public Soju getSoju(String name) { switch(name) { case "Jinro" : return new Jinro(); case "Chamisle" : return new Chamisle(); case "Daejangbu" : return new Daejangbu(); } return null; } @Override public Beer getBeer(String name) { return null; } }public class FactoryCreator { public static AlcoholFactory getFactory(String type) { if(type.equals("Beer")) { return new BeerFactory(); } else if(type.equals("Soju")) { return new SojuFactory(); } else return null; } }
public class main { public static void main(String[] args) { Beer terra = FactoryCreator.getFactory("Beer").getBeer("Terra"); System.out.println(terra.introduce()); Soju jinro = FactoryCreator.getFactory("Soju").getSoju("Jinro"); System.out.println(jinro.introduce()); } }
결과.
* 팩토리 패턴은 객체지향디자인 패턴입니다.
시스템을 구상하거나 설계 할 때 객체를 추상화하고 일반화하는 사고로 객체간의 결합도를 낮추고 일관성과 자율성을 보장하도록 합니다.
시스템을 구상하거나 설계 할 때 객체를 추상화하고 일반화하는 사고로 객체간의 결합도를 낮추고 일관성과 자율성을 보장하도록 합니다.
댓글
댓글 쓰기