[Gof-1] 추상 팩토리 패턴 Abstract Factory Pattern

극락코딩·2021년 8월 6일
1

Gof

목록 보기
2/2


추상 팩토리 패턴이란?

Abstract Factory Pattern은 구체적인 클래스에 의존하지 않고 서로 연관된 객체들의 조합을 만드는 인터페이스를 제공하는 패턴입니다! 다양한 구성 요소 별로 객체의 집합을 생성해야 할 때 유용

  • 추상 팩토리 팩토리 패턴은 관련 있는 객체를 묶어서 만들고, 조건에 맞추어 각각의 객체를 생성할 수 있는 패턴입니다! 팩토리 메서드와 유사하지만, 한층 더 추상화화여 사용하는 방법입니다!!

  • 팩토리 패턴과 다르게 추상 클래스에 의존하는 구상 클래스를 생성하지 않아도 인스턴스를 생성할 수 있는 장점이 있습니다! 서로 다른 객체들을 하나의 공장에서 관리함으로써 생성할 수 있는 장점이 있습니다!!

추상 팩토리 다이어그램입니다!

charger

public interface Charger {
    String message = "충전기 생성";
}

public class LgCharger implements Charger {
    public LgCharger() {
        System.out.println(Brand.LG + message);
    }
}

public class AppleCharger implements Charger {
    public AppleCharger() {
        System.out.println(Brand.APPLE + message);
    }
}
  • charger interfact를 통해 lg와 apple charger를 하나로 묶었습니다!!
  • 공통된 부분이 많은 것 같아서 이점은 다시 수정해보려고 합니다!

laptop

public interface Laptop {
    String message = "노트북 생성";
}

public class LgLaptop implements Laptop {
    
    public LgLaptop() {
        System.out.println(Brand.LG + message);
    }
}

public class AppleLaptop implements Laptop {

    public AppleLaptop() {
        System.out.println(Brand.APPLE + message);
    }
}
  • laptop도 charger와 마찬가지로 묶어서 만들었습니다!!
  • 학습을 진행하기 위한 예제로 사용하려다 보니 부족한게 많은 것 같습니다....ㅜㅜ

ProductFactory

public interface ProductFactory {
    Laptop createLaptop();

    Charger createCharger();
}

lgProductFactory

public class LgProductFactory implements ProductFactory {
    @Override
    public Laptop createLaptop() {
        return new LgLaptop();
    }

    @Override
    public Charger createCharger() {
        return new LgCharger();
    }
}
  • Factory를 통해서 LG 상품을 하나로 묶어 생성할 수 있도록 구현했습니다!

appleProductFactory

public class AppleProductFactory implements ProductFactory {
    @Override
    public AppleLaptop createLaptop() {
        return new AppleLaptop();
    }

    @Override
    public AppleCharger createCharger() {
        return new AppleCharger();
    }
}
  • lg Factory와 마찬가지로 묶어서 만들었습니다!!
  • 추상 팩토리 패턴을 활용하니 더 쉽고 알아볼 수 있는 코드를 구현할 수 있게 된 것 같습니다
  • 다만 아직 초보자라 구현하는데 많은 시간이 걸린 것 같습니다...ㅜㅜㅜ

BrandFacotry

public class BrandFactory {
    public void createProduct(String brandName) {
        Brand brand = Brand.findByBrand(brandName);
        ProductFactory productFactory = choiceFactory(brand);
        createParts(productFactory);
    }

    private ProductFactory choiceFactory(Brand brand) {
        if (brand == Brand.LG) {
            return new LgProductFactory();
        }
        return new AppleProductFactory();
    }

    private void createParts(ProductFactory productFactory) {
        productFactory.createLaptop();
        productFactory.createCharger();
    }
}
  • BrandFactory를 통해 알맞은 brand를 찾고, 그 브랜드의 하위 메서드를 생성할 수 있도록 구현했습니다!!

Brand

public enum Brand {

    LG("엘지"),
    APPLE("애플");

    private final String brand;

    Brand(final String brand) {
        this.brand = brand;
    }

    private static final String BRAND_SEARCH_ERROR_MESSAGE = "브랜드명이 잘못된 입력입니다.";

    public static Brand findByBrand(String inputBrand) {
        return Arrays.stream(Brand.values())
                .filter(b -> b.brand.equals(inputBrand))
                .findAny()
                .orElseThrow(() -> new IllegalArgumentException(BRAND_SEARCH_ERROR_MESSAGE));
    }

}
  • Enum class는 예제에서 딱히 사용을 안하시는 것 같은데,,, 저는 이게 편리해서 사용해봤습니다!

마치며

  • 위키피디아에서 본 클래스 다이어그램과 구글링을 통해 여러 예제를 본 것 같습니다. 실제로 추상 팩토리 패턴을 사용해서 예제를 학습하다보니, interface로 묶어주고 또 묶어준 것을 한번 더 묶어줌으로서 이후 로직이 간단하고 가시성이 높아짐을 확인하게 되었습니다!!
  • 아직 예제 코드에서 수정할 부분이 많아서 추후 조금씩 수정하고 업로드하겠습니다!
profile
한 줄에 의미를, 한 줄에 고민을

0개의 댓글