추상 팩토리 Abstract Factory
🙈

추상 팩토리 Abstract Factory

Created
Apr 18, 2024 07:35 AM
Last edited time
Last updated April 18, 2024
Tags
CS
Language
URL

Intro::

추상팩토리에 대해서 알아봅시다.
 

추상팩토리란?

디자인 패턴 중 하나로, 서로 관련있거나 의존적인 여러 객체를 만들기 위한 인터페이스를 제공합니다. 이 패턴은 구체적인 클래스에 의존하지 않고도 객체의 집합을 생성하거나 조합할 수 있도록 해주는 것이 특징입니다. 주로 제품군을 생성할 때 유용하게 사용됩니다.
 
💡
추상 팩토리 패턴은 복잡한 시스템에서 여러 제품군을 효율적으로 관리할 필요가 있을 때 매우 유용하지만, 단순한 어플리케이션에서는 과도한 구조가 될 수 있으므로 사용할 때는 신중을 기해야 합니다.

장점

  1. 제품군의 일관성: 추상 팩토리는 제품들이 서로 일관성을 유지하도록 보장합니다. 예를 들어, 특정 GUI 요소들이 모두 Windows 스타일로 일관되게 생성되도록 합니다.
  1. 확장성: 새로운 종류의 제품군을 추가하기가 용이합니다. 예를 들어, 새로운 운영 체제 스타일을 지원하기 위해 새로운 팩토리와 제품 클래스를 추가하기만 하면 됩니다.
  1. 코드의 격리: 클라이언트 코드는 구체적인 제품 클래스에 대한 의존성 없이, 팩토리 인터페이스를 통해 제품을 생성할 수 있습니다. 이는 코드 변경에 대한 유연성을 증가시키고, 낮은 결합도를 유지합니다.
  1. 교체 용이성: 실행 시점에 팩토리를 변경함으로써 다른 제품군으로 쉽게 전환할 수 있습니다. 이는 다양한 환경 설정이나 조건에 따라 다른 동작을 유연하게 제공할 수 있게 합니다.

단점

  1. 복잡성 증가: 추상 팩토리 패턴을 구현하면 초기 코드 구조가 복잡해질 수 있습니다. 각 제품군마다 별도의 클래스를 정의해야 하기 때문에 클래스와 인터페이스가 많아집니다.
  1. 코드의 난이도 상승: 패턴을 사용하면서 여러 계층과 상호 작용하는 구조 때문에 코드 이해와 관리가 더 어려워질 수 있습니다.
  1. 유연성 제한: 일단 팩토리와 제품 클래스가 구현되고 나면, 새로운 종류의 제품을 추가하기 위해서는 전체 시스템에서 팩토리 클래스와 클라이언트 코드를 수정해야 할 수도 있습니다.
 

코드

  1. 추상 팩토리 및 제품 인터페이스 정의
    1. 먼저, UI 컴포넌트를 생성하는 추상 팩토리 인터페이스와, 생성될 제품(버튼, 체크박스)의 인터페이스를 정의합니다.
      javaCopy code public interface GUIFactory { Button createButton(); Checkbox createCheckbox(); } public interface Button { void paint(); } public interface Checkbox { void paint(); }
  1. 구체적인 팩토리 및 제품 클래스 생성
    1. 각 운영 체제에 맞는 구체적인 팩토리 클래스를 생성하고, 이 팩토리에서는 해당 운영 체제 스타일의 버튼과 체크박스를 생성합니다.
      javaCopy code // Windows 스타일의 구체적인 팩토리와 제품 public class WindowsFactory implements GUIFactory { @Override public Button createButton() { return new WindowsButton(); } @Override public Checkbox createCheckbox() { return new WindowsCheckbox(); } } public class WindowsButton implements Button { @Override public void paint() { System.out.println("Windows 스타일 버튼을 그립니다."); } } public class WindowsCheckbox implements Checkbox { @Override public void paint() { System.out.println("Windows 스타일 체크박스를 그립니다."); } }
      맥이나 리눅스 운영 체제에 맞는 다른 팩토리와 제품 클래스도 비슷한 방식으로 구현할 수 있습니다.
  1. 클라이언트 코드
    1. 클라이언트 코드에서는 특정 팩토리를 선택하여 제품을 생성하고 사용합니다.
      javaCopy code public class Application { private Button button; private Checkbox checkbox; public Application(GUIFactory factory) { button = factory.createButton(); checkbox = factory.createCheckbox(); } public void paint() { button.paint(); checkbox.paint(); } } public class Demo { public static void main(String[] args) { GUIFactory factory = new WindowsFactory(); // 여기서 Windows 또는 다른 팩토리로 변경 가능 Application app = new Application(factory); app.paint(); } }
 

References::

Loading Comments...