HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
🤩
개발
/
Java
Java
/
🏜️
디자인 패턴
/
🧑‍🏭
Abstract Factory
🧑‍🏭

Abstract Factory

설명

Abstract Factory 패턴은 생성 패턴으로 어떤 object(eg. 클래식 가구) 대해 그 object와 관련된 것들(A family of related products ex. 클래식 의자, 클래식 책상, 클래식 커피책상 ...)을 구체 클래스를 통하지 않고 다 만들어낼 수 있게 해주는 패턴임
Factory 를 찍어내는 Factory다.
 

상황

  • Chair + Sofa + CoffeeTable = A family of related products 라고 할 때
  • 해당하는 family of related products를 다양한 버전으로 만들고 싶은 상황. 예를 들어 Modern한, Victorain, ArtDeco 버전의 제품들
  • 이 때, 같은 버전으로 매칭 해서 Chair , Sofa, CoffeeTable을 사야 하는 필요성이 있는 것임. 하나만 다르면 이상하니까
  • 그리고, 새로운 제품(eg. Bed)을 추가하거나 새로운 버전(Classic)을 추가할 때 코드의 수정이 있으면 안됨

해결책

  • 제일 처음 할 것은, Family of related products(Chair, Sofa, CoffeeTable)등에 대해 interface를 만드는 것
notion image
  • 그다음 Abstract Factory를 구성하는 것(모든 product - Chair, Sofa, CoffeeTable 를 만드는 메소드를 포함한 ⇒ FurnitureFactory)
    • createChair(), createCoffeeTable(), createSofa() 각각은 interface를 반환하도록 구현하기
  • 각 버전별 Factory를 구현하기(VictorainFurnitureFactory, ModernFurnitureFactory )
  • 그러므로, Client code에서는 FurnitureFactory와 Chair, Sofa, CoffeeTable interface만을 가지고 객체들을 만들어낼 수 있음
notion image

코드

Factory

public interface FurnitureFactory { Chair createChair(); void createCoffeeTable(); void createSofa(); } public class ModernFurnitureFactory implements FurnitureFactory{ @Override public Chair createChair() { return new ModernChair(); } @Override public void createCoffeeTable() { } @Override public void createSofa() { } } //...

Client

public static void main(String[] args) { makeChairAndSit(FactoryType.Modern); makeChairAndSit(FactoryType.Victorian); } public static void makeChairAndSit(FactoryType type){ if(type == FactoryType.Modern){ FurnitureFactory factory = new ModernFurnitureFactory(); factory.createChair().sitOn(); } else if(type == FactoryType.Victorian){ FurnitureFactory factory = new VictorianFurnitureFactory(); factory.createChair().sitOn(); } }

개인적 견해

  • Abstract Factory는 Factory와는 다른점이 Factory에서는 하나의 종(eg : 운송수단 → 배, 차, ...)에 대해서 여러 가지 버전으로 생성해 낼 때 쓰이지만, Abstract Factory 패턴은 여러가지 종(의자 → 모던의자, 클래식의자.., 책상 → 모던책상, 클래식 책상..., 소파 → 모던소파, 클래식 소파)에 대해서 생성해 낼 때 쓰이게 됨
  • Factory 패턴 보다 조금 더 추상화 하여 사용함
    • 그 이유는 Factory 패턴은 1차원, Abstract Factory는 2차원 이라서 한 차원 더 추상화 시켰다고 생각하면 됨
    • Factory는 하나의 종에 대해서 만 확장을 하는데 반해, Abstract Factory는 여러 종으로 확장을 해야 하고(FurnitureFactory → ModernFurnitureFactory, VictorianFurniture...) 그 종 안에서 또 위의 Factory 패턴이 적용 되는 것