객체 생성을 직접하지 않고, 하위 클래스가 어떤 객체를 생성할지 결정하도록 위임하는 디자인 패턴
팩토리 클래스에 위임해
객체를 생성하도록 하는 방식설명을 잘해주셔서 참고하였습니다
설명을 잘해주셔서 참고하였습니다 2
아래 코드 TypeA, TypeB, TypeC는 Type 추상 클래스를 정의하여 캡슐화하고 ClassA에서 createType()에서 문자열 type에 따라 Type클래스 생성을 분기처리 한다
// Type.java
public abstract class Type {
}
// TypeA.java
public class TypeA extends Type {
public TypeA() {
System.out.println("Type A 생성");
}
}
// TypeB.java
public class TypeB extends Type {
public TypeB() {
System.out.println("Type B 생성");
}
}
// TypeC.java
public class TypeC extends Type {
public TypeC() {
System.out.println("Type C 생성");
}
}
// ClassA.java
public class ClassA {
public Type createType(String type) {
Type returnType = null;
switch (type) {
case "A":
returnType = new TypeA();
break;
case "B":
returnType = new TypeB();
break;
case "C":
returnType = new TypeC();
break;
}
return returnType;
}
}
// Client.java
public class Client {
public static void main(String args[]) {
ClassA classA = new ClassA();
classA.createType("A");
classA.createType("C");
}
}
만약 객체를 생성하는 코드가 여러 클래스에서 사용하는 경우라면?
아래 처럼 중복코드가 클래스 개수만큼 생겨 높아진 결합도(의존도)는 유지보수를 어렵게 만든다
// TypeFactory.java
public class TypeFactory {
public Type createType(String type) {
Type returnType = null;
switch (type) {
case "A":
returnType = new TypeA();
break;
case "B":
returnType = new TypeB();
break;
case "C":
returnType = new TypeC();
break;
}
return returnType;
}
}
// ClassA.java
public class ClassA {
public Type createType(String type) {
TypeFactory factory = new TypeFactory();
Type returnType = factory.createType(type);
return returnType;
}
}
https://dev-youngjun.tistory.com/195
https://bcp0109.tistory.com/367
https://velog.io/@newtownboy/%EB%94%94%EC%9E%90%EC%9D%B8%ED%8C%A8%ED%84%B4-%ED%8C%A9%ED%86%A0%EB%A6%AC%EB%A9%94%EC%86%8C%EB%93%9C%ED%8C%A8%ED%84%B4Factory-Method-Pattern
https://www.google.com/search?q=%ED%85%9C%ED%94%8C%EB%A6%BF+%EB%A9%94%EC%86%8C%EB%93%9C+%ED%8C%A9%ED%86%A0%EB%A6%AC+%EB%A9%94%EC%86%8C%EB%93%9C&oq=%ED%85%9C%ED%94%8C%EB%A6%BF+%EB%A9%94%EC%86%8C%EB%93%9C+%ED%8C%A9%ED%86%A0%EB%A6%AC+%EB%A9%94%EC%86%8C%EB%93%9C&aqs=chrome..69i57.8053j0j7&sourceid=chrome&ie=UTF-8
https://velog.io/@borab/%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4-2-%ED%85%9C%ED%94%8C%EB%A6%BF-%EB%A9%94%EC%84%9C%EB%93%9C-%ED%8C%A8%ED%84%B4-%ED%8C%A9%ED%86%A0%EB%A6%AC-%EB%A9%94%EC%84%9C%EB%93%9C-%ED%8C%A8%ED%84%B4-%EC%B6%94%EC%83%81-%ED%8C%A9%ED%86%A0%EB%A6%AC-%ED%8C%A8%ED%84%B4#%EF%B8%8F-%ED%8C%A9%ED%86%A0%EB%A6%AC-%EB%A9%94%EC%84%9C%EB%93%9C-%ED%8C%A8%ED%84%B4-%EC%83%9D%EC%84%B1-%ED%8C%A8%ED%84%B4%EF%B8%8F