추상 팩토리 패턴

ynkim·2024년 11월 14일
0

관련 객체들로 형성된 패밀리가 있고 패밀리 내에서 일치되는 변형을 가지도록 할 때 구상 클래스를 지정하지 않고도 객체를 생성할 수 있는 생성패턴

구조

  • 추상 제품 인터페이스와 이를 다양한 스타일로 구현하는 구상 제품
  • 추상 제품 패밀리를 생성하는 추상 팩토리와 각 스타일로 제품 패밀리 객체를 생성하는 구상 팩토리
  • 구상 객체에 의존하지 않는 클라이언트 코드

코드 예시

public interface Button {
	void paint();
}
public class WinButton implements Button {
	@Override
    public void paint() {
    	System.out.println("window button");
    }
}
public class MacButton implements Button {
	@Override
    public void paint() {
    	System.out.println("mac button");
    }
}
public interface Checkbox {
	void paint();
}
public class WinCheckbox implements Checkbox {
	@Override
    public void paint() {
    	System.out.println("window checkbox");
    }
}
public class MacCheckbox implements Checkbox {
	@Override
    public void paint() {
    	System.out.println("mac checkbox");
    }
}
public interface GUIFactory {
	Button createButton();
    Checkbox createCheckbox();
}
public class WinFactory implements GUIFactory {
	@Override
    public Button createButton() {
    	return new WinButton();
    }
    
    @Override
    public Checkbox createCheckbox() {
    	return new WinCheckbox();
    }
}
public class MacFactory implements GUIFactory {
	@Override
    public Button createButton() {
    	return new MacButton();
    }
    
    @Override
    public Checkbox createCheckbox() {
    	return new MacCheckbox();
    }
}
public class Application {
	private GUIFactory factory;
    private Button button;
    
    public Application(GUIFactory factory) {
    	this.factory = factory;
    }
    
    public void createUI() {
    	this.button = factory.createButton();
    }
    
    public void paint() {
    	button.paint();
    }
}
public class ApplicationConfigurator {
	public static void main(String args[]) {
        GUIFactory factory;
        String os = System.getProperty("os.name").toLowerCase();

        if (os.contains("win")) {
            factory = new WinFactory();
        } else if (os.contains("mac")) {
            factory = new MacFactory();
        } else {
        	throw new Exception("Unknown operating system.");
        }
        
        Application app = new Application(factory);
    }
}

장단점

장점

  • 같은 스타일 제품들의 호환을 보장할 수 있다.
  • 클라이언트 코드가 구상제품에 의존하는 것을 피할 수 있다.
  • 제품 생성 코드를 추출하여 단일 책임 원칙을 지킬 수 있다.
  • 새로운 스타일이 추가 됐을 때 기존 클라이언트 코드를 변경하지 않아 개방/폐쇄 원칙을 지킬 수 있다.
    단점
  • 인터페이스과 클래스가 많아진다.

0개의 댓글