on
디자인패턴 -1- 추상 팩토리 패턴
디자인패턴 -1- 추상 팩토리 패턴
오늘 공부한 내용은 디자인 패턴 중 생성 패턴중 하나인 추상 팩토리 패턴이다.
의도
추상 팩토리 패턴(Abstract factory pattern)은 다양한 구성 요소 별로 '객체의 집합'을 생성해야 할 때 유용하다. 이 패턴을 사용하여 상황에 알맞은 객체를 생성할 수 있다. 위키 백과 추상 팩토리 패턴
장점
해당 추상 팩토리 패턴을 쓰면 Client가 구체 클래스가 아닌 인터페이스에 의존하여 제품군을 쉽게 대체 가능하여 다형성을 만족 시키기 쉽다.
연관된 객체사이의 일관성을 높일 수 있습니다.
단점
단점으로는 추상팩토리내에 새로운 객체를 생성하는 메소드를 변경해야할 때 많은 비용이 발생합니다. 맨위의 추상 팩토리 클래스에서 새로운 객체를 생성하는 메소드를 추가해야하므로 서브클래스 전체가 변경되어야 합니다.
자바로 구현한 추상 팩토리 패턴
객체 다이어그램
AbstactFactory
package gof.creation.abstractfactory; public interface AbstractFactory { AbstractProductA createProductA(); AbstractProductB createProductB(); }
ConcreteFactory
package gof.creation.abstractfactory; public class ConcreteFactory1 implements AbstractFactory { private static int sequence = 0; @Override public ProductA1 createProductA() { return new ProductA1("ProductA1 " + ++sequence); } @Override public ProductB1 createProductB() { return new ProductB1("ProductB1 " + ++sequence); } } //////////////////////////////////////////////////////////// package gof.creation.abstractfactory; public class ConcreteFactory2 implements AbstractFactory{ private static int sequence = 0; @Override public ProductA2 createProductA() { return new ProductA2("ProductA2 " + ++sequence); } @Override public ProductB2 createProductB() { return new ProductB2("ProductB2 " + ++sequence); } }
Abstract ProductA & 구체 클래스
package gof.creation.abstractfactory; public interface AbstractProductA { String getName(); String getFrom(); } //////////////구체 클래스/////////////////// //A1 package gof.creation.abstractfactory; public class ProductA1 implements AbstractProductA{ private String name; public ProductA1(String name) { this.name = name; } @Override public String getName() { return this.name; } @Override public String getFrom() { return "ProductA1"; } } //A2 package gof.creation.abstractfactory; public class ProductA2 implements AbstractProductA{ private String name; public ProductA2(String name) { this.name = name; } @Override public String getName() { return this.name; } @Override public String getFrom() { return "ProductA2"; } }
Abstract ProductB & 구체 클래스
package gof.creation.abstractfactory; public interface AbstractProductB { String getName(); String getFrom(); } ////////////구체 클래스///////// //B1 package gof.creation.abstractfactory; public class ProductB1 implements AbstractProductB{ private String name; @Override public String getName() { return this.name; } @Override public String getFrom() { return "ProductB1"; } public ProductB1(String name) { this.name = name; } } //B2 package gof.creation.abstractfactory; public class ProductB2 implements AbstractProductB{ private String name; public ProductB2(String name) { this.name = name; } @Override public String getName() { return this.name; } @Override public String getFrom() { return "ProductB2"; } }
Test
package gof.creation; import gof.creation.abstractfactory.*; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; public class AbstractFactoryTest { AbstractFactory factory1 = new ConcreteFactory1(); AbstractFactory factory2 = new ConcreteFactory2(); @Test void abstractFactoryTest1() throws Exception { //given //when AbstractProductA productA = factory1.createProductA(); AbstractProductB productB = factory1.createProductB(); //then assertThat(productA.getFrom()).isEqualTo("ProductA1"); assertThat(productB.getFrom()).isEqualTo("ProductB1"); assertThat(productA.getName()).isEqualTo("ProductA1 1"); assertThat(productB.getName()).isEqualTo("ProductB1 2"); } @Test void abstractFactoryTest2() throws Exception { //given //when AbstractProductA productA = factory2.createProductA(); AbstractProductB productB = factory2.createProductB(); //then assertThat(productA.getFrom()).isEqualTo("ProductA2"); assertThat(productB.getFrom()).isEqualTo("ProductB2"); assertThat(productA.getName()).isEqualTo("ProductA2 1"); assertThat(productB.getName()).isEqualTo("ProductB2 2"); } }
느낀점
간혹 개발이나, 코드를 짜다보면 한번에 같이 생성해야 하는 여러 객체가 있는데, 이 추상팩토리 패턴을 이용하여 한번에 생성할 경우 편하게 사용이 가능할 것 같다. 또한, 구체클래스의 변경이 자유로워 객체지향의 다형성을 잘 지키게 해주는 패턴인것 같다.
참조
Design Patterns/에릭 감마외 3명 /프로텍 미디어
https://ko.wikipedia.org/wiki/%EC%B6%94%EC%83%81_%ED%8C%A9%ED%86%A0%EB%A6%AC_%ED%8C%A8%ED%84%B4
from http://yoojsblog.tistory.com/214 by ccl(A) rewrite - 2021-11-25 21:01:40