팩토리 패턴
팩토리 패턴에는 2가지가 있다.
먼저 심플 팩토리(Simple Factory) 패턴을 알아보자.
💡 심플 팩토리 패턴
객체 만드는 작업을 하나의 팩토리 클래스에 모아두는 것을 의미한다.
심플 팩토리 패턴에서 createPhone() 부분에서 Factory에서 직접 객체를 만드는 것을 Factory를 상속한 서브클래스에서 객체를 만들게끔 하는 것이 팩토리 메소드 패턴이다.
위의 코드에 팩토리 메소드 패턴을 적용해보자.
① 팩토리 메소드 패턴
클래스의 인스턴스를 만드는 일을 서브클래스에게 맡기는 것이다.
심플 팩토리 패턴에서 만들었던 객체 생성하는 함수를 모아둔 클래스를 인터페이스화하여 서브클래스에서 어떤 객체를 생성할지 결정하는 것이다.
이렇게 서브 클래스를 둔다면 아이폰, 안드로이드폰의 종류가 열개로 늘어난다 해도 Phone 구현체 클래스 생성과 createPhone()의 분기처리만 하면 확장이 가능한 구조가 된다.
즉 클래스 만들 때 확장은 가능하게 하되, 한번 만들면 추후에 수정할 필요 없게 만들라는 원칙인 OCP (개방 폐쇄의 원칙 : Open Close Principle)를 따르게 된다.
② 추상 팩토리 패턴
구체적인 클래스에 의존하지 않고 서로 연관되거나 의존적인 객체들의 조합을 만드는 인터페이스를 제공하는 패턴이다.
먼저 위에서 본 메소드 팩토리 패턴에서는 PhoneFactory의 구현체 IPhoneFactory, AndroidPhoneFactory가 각각 IPhone객체 AndroidPhone객체 하나씩을 생성하게끔 작성했다.
추상 팩토리 패턴은 이것을 한번더 감싸서 하나의 Factory에서 여러개의 제품군(Product)조합을 생성할 수 있게 해주는 패턴이다.
💬 코드보기
///
public interface PhoneFactoryOfFactory {
PhoneFactory requestPhone(String company);
}
public class DefaultPhoneFactoryOfFactory implements PhoneFactoryOfFactory{
@Override
public PhoneFactory requestPhone(String company) {
switch (company) {
case "IPHONE":
return new IPhoneFactory();
case "ANDROID":
return new AndroidPhoneFactory();
}
throw new IllegalArgumentException();
}
}
///
///
public interface PhoneFactory {
Phone createPhone();
OS createOS();
}
public class IPhoneFactory implements PhoneFactory{
@Override
public Phone createPhone() {
OS os = createOS();
os.installOS();
return new IPhone();
}
@Override
public OS createOS() {
return new IOS();
}
}
public class AndroidPhoneFactory implements PhoneFactory{
@Override
public Phone createPhone() {
OS os = createOS();
os.installOS();
return new AndroidPhone();
}
@Override
public OS createOS() {
return new GoogleOS();
}
}
///
///
public interface OS {
void installOS();
}
public class IOS implements OS {
@Override
public void installOS() {
System.out.println("IOS 설치");
}
}
public class GoogleOS implements OS {
@Override
public void installOS() {
System.out.println("구글OS 설치");
}
}
///
///
public interface Phone {
public void call();
public void playGame();
}
public class IPhone implements Phone{
@Override
public void call() {
System.out.println("아이폰으로 전화하다");
}
@Override
public void playGame() {
System.out.println("아이폰으로 게임하다");
}
}
public class AndroidPhone implements Phone{
@Override
public void call() {
System.out.println("안드로이드로 전화하다");
}
@Override
public void playGame() {
System.out.println("안드로이드로 게임하다");
}
}
///
public class Main {
public static void main(String[] args) {
PhoneFactoryOfFactory phoneFactoryOfFactory = new DefaultPhoneFactoryOfFactory();
PhoneFactory iphoneFactory= phoneFactoryOfFactory.requestPhone("IPHONE"); //아이폰을 산다.
Phone iphone = iphoneFactory.createPhone();
iphone.call();
iphone.playGame();
PhoneFactory androidPhoneFactory = phoneFactoryOfFactory.requestPhone("ANDROID"); //안드로이드폰을 산다.
Phone androidPhone = androidPhoneFactory.createPhone();
androidPhone.call();
androidPhone.playGame();
}
}
//결과
IOS 설치
아이폰으로 전화하다
아이폰으로 게임하다
구글OS 설치
안드로이드로 전화하다
안드로이드로 게임하다
정리!
팩토리 메소드 패턴은 객체생성하는 인스턴스를 인터페이스화하여 서브클래스에 맡기는 것이다.
추상 메소드 패턴은 추상적인 메소드(서브클래스)의 조합을 만드는 인터페이스를 제공하는 패턴이다.
즉 팩토리 메소드 패턴을 여러개 만들어 한 interface에 모아둔 것을 추상 메소드 패턴이라 한다!
참고링크
'공부 > 추가공부' 카테고리의 다른 글
API란 (0) | 2024.05.16 |
---|---|
ObjectMapper와 ModelMapper (0) | 2024.04.25 |
[디자인패턴] 프록시 패턴과 프록시 서버 (0) | 2024.04.08 |
[디자인패턴] 전략 패턴(정책 패턴) (0) | 2024.04.07 |
디자인패턴(업뎃중...) (0) | 2024.03.31 |