[생성 패턴] - Simple Factory 패턴
팩토리 패턴을 가지고 있는 생성 패턴은 총 2가지로 팩토리 메서드 패턴과 추상 팩토리 패턴이 있습니다.
이 두 가지를 이해하기 위해서는 먼저 Simple Factory에 대한 이해가 필요합니다.사실 생략하고 바로 들어가도 되지만 두가지 패턴을 이해하는데 조금 더 도움이 됩니다.
Simple Factory는 엄밀히 말하면 패턴 방식이 아닙니다. 하지만 객체 지향 프로그램밍에서 자주 쓰이는 관용구임으로 이 게시글에서도 역시 Simple Factory라고 명명하겠습니다.
Factory 패턴의 궁극적인 목표는 객체 생성을 서브 객체에 책임을 넘기는 것을 목표로 합니다.
그렇게 되면 Product 와 Creator 간의 커플링(결합)이 느슨해지고 객체 생성의 책임을 서브클래스에 위임시키고 서브클래스에 대한 정보를 은닉이 가능해 지는 장점이 생깁니다.
그리고 클라이언트가 객체를 어떻게 생성하는지 몰라도 요청만 하면 해당 객체를 생성할 수 있다는 장점이 있습니다.
간단하게 말하면 문제가 덜 발생하는 코드를 설계할 수 있다는 의미겠지요.(그것이 디자인 패턴을 사용하는 이유니깐요) 하지만 정확하게 어떤 문제에서 어떻게 해결되며 어떤 점이 좋은지는 확실이 알 수 없습니다.
다만 복잡하고 어려운 코드일 경우 이 패턴을 사용하면 좀 더 간결해진다는 것을 알고 있을 뿐입니다. 오히려 간단한 코드일 경우 객체가 더 많아지고 코드도 더 길이집니다.
그럼 어떻게 생성을 서브 객체로 할 수 있게 되는지 알아보겠습니다.
먼저 필요한 객체를 생성하겠습니다.
간단한 학교 인원관리 프로그램을 만들 것입니다.
요약해서 선생님과 학생만 간단하게 관리한다고 생각해보겠습니다.
먼저 선생님과 학생 클래스가 필요합니다. 이때 이 학생과 선생님 객체는 모두 People이라는 상위 interface을 상속받는다고 가정하겠습니다.
public interface SFPeople {
enum Type{
STUDENT,
TEACHER
}
}
people 인터페이스 입니다. enum을 사용해 STDUENT와 TEACHER를 만들어 줍니다.
public class SFStudent implements SFPeople {
String name;
int age;
int stNum;
public SFStudent(String name, int age, int stNum) {
this.name = name;
this.age = age;
this.stNum = stNum;
}
public void showStudent(){
System.out.println("이름 : " + name);
System.out.println("나이 : " + age);
System.out.println("학번 : " + stNum);
}
}
public class SFTeacher implements SFPeople {
String name;
int age;
String subject;
public SFTeacher(String name, int age, String subject) {
this.name = name;
this.age = age;
this.subject = subject;
}
public void showTeacher(){
System.out.println("이름 : " + name);
System.out.println("나이 : " + age);
System.out.println("과목 : " + subject);
}
}
선생님 클래스와 학생 클래스를 만들어 줍니다.
여기서 클라이언트가 해당 객체를 생성하기 위해서는 원래 아래와 같은 행위를 해야했습니다.
public class SFClient {
public static void main(String[] args) {
SFStudent sts = new SFStudent("이윤하",17,062345);
SFTeacher sft = new SFTeacher("궤도",28,"과학");
}
}
여기서 클라이언트가 직접 객체를 생성하는 것이 아니고 서브 클래스가 객체를 생성하고 클라이언트는 서브 클래스의 함수만 호출해서 클라이언트가 직접적으로 클래스에 연결되는 것을 약하게 해줍니다.
public class SFPeopleFactory {
public SFStudent creatPeople(String name, int age, int stNum){
return new SFStudent(name, age, stNum);
}
public SFTeacher creatPeople(String name, int age, String subject){
return new SFTeacher(name, age, subject);
}
}
서브 팩토리 클래스를 만들어 해당 객체를 생성하고 함수로 원하는 객체를 생성할 수 있도록 구조를 만듭니다.
그럼 클라이언트에서 다음처럼 객체를 만들 수 있습니다.
public class SFClient {
public static void main(String[] args) {
SFPeopleFactory peopleFactory = new SFPeopleFactory();
SFStudent student = peopleFactory.creatPeople("이윤하",17,062324);
SFTeacher teacher = peopleFactory.creatPeople("궤도",28,"과학");
}
}
위에 코드를 구조로 그린다면 다음과 같습니다.
SimpleFactory는 디자인 패턴이 아닙니다. 여기서 만약에 학부모라는 객체를 추가하게 되면 팩토리 클래스를 수정해야하는데 그렇게 되면 OCP 원칙에 위배됩니다.
다음에는 OCP원칙에 위배되지 않는 진짜 디자인 패턴인 팩토리 메서드 패턴과 추상 팩토리 패턴을 정리하도록 하겠습니다.
Reference
https://refactoring.guru/ko/design-patterns/factory-method
팩토리 메서드 패턴
/ 디자인 패턴들 / 생성 패턴 팩토리 메서드 패턴 다음 이름으로도 불립니다: 가상 생성자, Factory Method 의도 팩토리 메서드는 부모 클래스에서 객체들을 생성할 수 있는 인터페이스를 제공하지
refactoring.guru
https://dev-youngjun.tistory.com/195#head10
팩토리 메소드 패턴(Factory Method Pattern)
1. 팩토리 메소드 패턴이란? 다양한 구현체 (Product)가 있고, 그 중에서 특정한 구현체를 만들 수 있는 다양한 팩토리(Creator)를 제공할 수 있다. 1-1. 정의(Definition) 1-1-1. 팩토리 패턴? 객체의 생성을
dev-youngjun.tistory.com
https://earthkingman.tistory.com/118
클래스다이어그램 관계
클래스 다이어그램이란? 시스템을 구성하는 클래스들 사이의 관계를 표현해주는 그림 도식입니다. 1.의존 관계(dependency) 표시 : 점선 화살표 설명 : 연관 관계와 같이 한 클래스가 다른 클래스에
earthkingman.tistory.com
https://bcp0109.tistory.com/366
Factory 패턴 (1/3) - Simple Factory
1. Overview Factory 패턴은 객체 생성 역할을 별도의 클래스 (Factory) 에게 위임하는 것이 가장 궁극적인 목표입니다. 디자인 패턴 중 Facotry 와 관련된 패턴은 크게 두 가지가 있습니다. 팩토리 메서드
bcp0109.tistory.com