Factory Pattern
- 팩토리 메소드 패턴, 추상 팩토리 패턴이 있음
Simple Factory Pattern
- 객체를 생성하는 클래스를 따로 두는 것
- 예시에서 휴대폰 공장에서 switch문을 통해 주문한 휴대폰 객체를 메소드를 통해 직접 생성
public class SimplePhoneFactory {
public Phone orderPhone(String type) {
Phone phone = createPhone(type);
phone.complete();
return phone;
}
private Phone createPhone(String type) {
return switch (type) {
case "IPHONE" -> new IPhone();
case "ANDROID" -> new AndroidPhone();
default -> null;
};
}
}
public interface Phone {
void complete();
void call();
}
public class IPhone implements Phone{
@Override
public void complete() {
System.out.println("아이폰 완성");
}
@Override
public void call() {
System.out.println("아이폰으로 전화를 한다");
}
}
public class AndroidPhone implements Phone{
@Override
public void complete() {
System.out.println("안드로이드폰 완성");
}
@Override
public void call() {
System.out.println("안드로이드폰으로 전화를 한다");
}
}
public class Practice {
public static void main(String[] args){
SimplePhoneFactory simplePhoneFactory = new SimplePhoneFactory();
Phone phone = simplePhoneFactory.orderPhone("ANDROID");
phone.call();
}
}
안드로이드폰 완성
안드로이드폰으로 전화를 한다

Factory Method Pattern
- 클래스의 인스턴스를 만드는 일을 서브클래스에게 맡김
- 팩토리가 인터페이스화 되고 하위 팩토리들에서 객체 생성함
- 폰의 종류가 늘어나도 phone 구현체 클래스와 createPhone의 분기처리만 해서 확장 가능
public interface PhoneFactory {
default Phone orderPhone() {
Phone phone = createPhone();
phone.complete();
return phone;
}
Phone createPhone();
}
public class IPhoneFactory implements PhoneFactory {
@Override
public Phone createPhone() {
return new IPhone();
}
}
public class AndroidPhoneFactory implements PhoneFactory {
@Override
public Phone createPhone() {
return new AndroidPhone();
}
}
public interface Phone {
void complete();
void call();
}
public class IPhone implements Phone{
@Override
public void complete() { System.out.println("아이폰 완성"); }
@Override
public void call() { System.out.println("아이폰으로 전화를 한다"); }
}
public class AndroidPhone implements Phone{
@Override
public void complete() {System.out.println("안드로이드폰 완성");}
@Override
public void call() {System.out.println("안드로이드폰으로 전화를 한다");}
}
public class Practice {
public static void main(String[] args){
IPhoneFactory iPhoneFactory = new IPhoneFactory();
Phone phone7 = iPhoneFactory.orderPhone();
phone7.call();
AndroidPhoneFactory androidPhoneFactory = new AndroidPhoneFactory();
Phone phone2 = androidPhoneFactory.orderPhone();
phone2.call();
}
}
아이폰 완성
아이폰으로 전화를 한다
안드로이드폰 완성
안드로이드폰으로 전화를 한다

Abstract Factory
- 구체적인 클래스에 의존하지 않고 서로 연관되거나 의존적인 객체들의 조합을 만드는 인터페이스를 제공하는 패턴
- 구체적인 클래스를 사용자로부터 분리하고 사용시에는 정의된 인터페이스에 정의된 추상 메소드를 사용한다
- 제품군을 쉽게 대체할 수 있다
- 새로운 종류의 제품을 제공하기 어렵다
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 설치
안드로이드로 전화하다
안드로이드로 게임하다
