디자인 패턴(7)
-
[SOLID] 인터페이스 분리 원칙(Interface segregation principle)
인터페이스 분리 원칙(Interface segregation principle) 인터페이스는 그 인터페이스를 사용하는 클라이언트를 기준으로 분리해야 한다. 예를 들어, ArticleWriteService, ArticleListService, ArticleDeleteService가 각각 상위클래스를 가진다면 ArticleService 하나가 아닌 각각의 상위클래스를 가져서 ISP에 부합하는 패턴입니다. 출처: 개발자가 반드시 정복해야 할 객체 지향과 디자인 패턴 - 최범균 저
2022.05.25 -
[SOLID] 리스코프 치환 원칙(Liskov substitution principle)
리스코프 치환 원칙(Liskov substitution principle) OCP를 받쳐 주는 다형성에 관한 원칙을 제공합니다. LSP는 다음과 같습니다. 상위 타입의 객체를 하위 타입의 객체로 치환해도 상위 타입을 사용하는 프로그램은 정상적으로 작동해야 한다. public void someMethod(SuperClass sc) { sc.someMethod(); } SuperClass의 someMethod()에 하위 타입의 객체를 전달해도 정상적으로 동작해야 한다는 것이 LSP 입니다. someMethod( new SubClass() ); 코드로 예를 들어보면, Coupon 클래스에서 Item을 파라미터로 받아 할인 금액(할인율 * 가격)을 반환하는 메서드가 있습니다. 이 때 구현클래스 할인이 안되는 아..
2022.05.25 -
[SOLID] 개방 폐쇄 원칙(Open-closed principle)
개방 폐쇄 원칙(Open-closed principle) 확장에는 열려 있어야 하고, 변경에는 닫혀 있어야 합니다. 풀어 보면 다음과 같습니다. 기능을 변경하거나 확장할 수 있으면서 그 기능을 사용하는 코드는 수정하지 않는다. FlowController(사용하는 코드)에서 ByteSource(interface)를 사용한다면, 메모리에서 byte를 읽어 오는 기능을 추가해야 할 때 MemoryByteSource클래스를 구현해서 FlowController의 코드를 수정하지 않고 기능을 추가할 수 있습니다. 즉, 확장되는 부분을 ByteSource로 추상화했기 때문에 확장에는 열려있고 (기능을 사용하는 코드의) 변경에는 닫혀 있다고 표현한 것입니다. 개방 폐쇄 원칙이 깨질 대의 주요 증상 추상화와 다형성이 O..
2022.05.25 -
[패캠강의] 빌더패턴
Builder 패턴 Builder 패턴 객체를 생성할 때 단계적 생성에 중점을 두는 패턴입니다. 동일한 생성 과정을 통해 다른 구현을 할 수 있다는 것이 큰 특징입니다. 객체 협력 예시 Builder : 인터페이스나 추상클래스 Concrete Builder : Builder를 구현한 클래스 Director : Builder를 사용해 Product를 생성 Product : 결과물 예제코드 MakeReport(Builder)를 textReport, HTMLReport 등으로 다양하게 구현할 수 있습니다. public interface MakeReport { String makeHeader(); String makeBody(); String makeConclusion(); String getReport(); ..
2022.01.15 -
[패캠강의] 프로토 타입 패턴
[패캠강의] 프로토 타입 패턴 복잡한 클래스의 인스턴스를 생성할 때 하나의 견본(prototype)을 만들어 초기화해두고 이를 복제해서 객체를 사용하는 방법입니다. (Java clone() 메서드라고 생각하시면 됩니다.) 예제코드를 보면 바로 이해할 수 있을 겁니다. 주의할 점은 Mark interface(override해야할 메서드가 없이 특성만 알려주는 인터페이스) Cloneable과 깊은 복사입니다. 참고로 Arrays.copyOf() 메서드도 깊은 복사를 채택합니다. //Arrays.copyOf() 메서드 docs, 새로운 배열을 만들어서 System.arraycopy 해줍니다. public static int[] copyOf(int[] original, int newLength) { int[] ..
2022.01.12 -
[패캠강의] 팩토리 메서드 패턴
Factory Method Pattern 하위 클래스에게 위임하는 패턴 중 하나입니다. 팩토리를 하나 두고, 들어오는 매개 변수에 따라서든 Map에 해당되는 keyword에 따라서든 인스턴스를 다르게 반환해줄 수 있는 패턴입니다. 팩토리에서 조건이나 인스턴스 관리를 맡아하면 하위 클래스는 변경에 대처할 부분이 적어지는 장점이 있습니다. JDK에서 사용되는 팩토리 메서드는 getInstance()가 java.util.Calendar, NumberFormat, ResourceBundle에서 사용되고 있습니다. 레퍼 클래스 Integer, Boolean etc 들에서 value들을 측정하기 위해 valueOf() 메서드를 사용할때도 팩토리 메서드 패턴을 사용합니다. public class Calendar { ..
2022.01.01