Abstract Factory Pattern
은 구체적인 클래스에 의존하지 않고 서로 연관된 객체들의 조합을 만드는 인터페이스를 제공하는 패턴입니다! 다양한 구성 요소 별로객체의 집합
을 생성해야 할 때 유용
추상 팩토리 팩토리 패턴은 관련 있는 객체를 묶어서 만들고, 조건에 맞추어 각각의 객체를 생성할 수 있는 패턴입니다! 팩토리 메서드와 유사하지만, 한층 더 추상화화여 사용하는 방법입니다!!
팩토리 패턴과 다르게 추상 클래스에 의존하는 구상 클래스를 생성하지 않아도 인스턴스를 생성할 수 있는 장점이 있습니다! 서로 다른 객체들을 하나의 공장에서 관리함으로써 생성할 수 있는 장점이 있습니다!!
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);
}
}
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);
}
}
public interface ProductFactory {
Laptop createLaptop();
Charger createCharger();
}
public class LgProductFactory implements ProductFactory {
@Override
public Laptop createLaptop() {
return new LgLaptop();
}
@Override
public Charger createCharger() {
return new LgCharger();
}
}
public class AppleProductFactory implements ProductFactory {
@Override
public AppleLaptop createLaptop() {
return new AppleLaptop();
}
@Override
public AppleCharger createCharger() {
return new AppleCharger();
}
}
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();
}
}
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));
}
}