Factory method pattern은 객체를 생성하는 인터페이스는 미리 정의하되, 인스턴스를 만들 클래스의 결정은 서브클래스 쪽에서 내리는 패턴이다. 팩토리 메서드 패턴에서는 인스턴스를 만드는 시점을 서브클래스로 미룬다.
http://ko.wikipedia.org/wiki/Factory_method_pattern
위와 같이, 객체 생성부분을 인터페이스로 정의하고, 인스턴스를 만들 클래스의 결정을 서브클래스에서 내리는 패턴이 팩토리 패턴이다.
아래는 ActionScript3로 작성된 예이다.
이전 포스팅에 있던 글역시 틀린글은 아니다. 하지만 논란의 여지가 있을뿐..
package factory
|
--------------------------------------------------------------------------------------
이전 포스팅...
//------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------
팩토리 패턴에서는 인스턴스의 생성을 팩토리에게 위임하는 형식이니까...
이름과 학번을 포함한 클래스를 Student 라고 합죠.
public abstract Student
{
prviate String name
private String id;
public Student(String name, String id)
{
this.name = name;
this.id = id;
}
public abstract void identify();
}
그러면 고딩도 있을 것이고..
public class HighSchoolStudent extends Student
{
public HighSchoolStudent(String name, String id)
{
super(name, id);
}
public void idetify()
{
System.out.println("HighSchool student : " + name + ", " + id);
}
}
대딩도 있을 것이고...
public class CollegeStudent extends Student
{
public CollegeStudent(String name, String id)
{
super(name, id);
}
public void idetify()
{
System.out.println("College student : " + name + ", " + id);
}
}
보통은 이 객체들을 만들때
Student student = new CollegeStudent("맹구", "1991520");
이렇게 만들잖아요...
그런데 팩토리패턴에서는 팩토리라는 클래스가 알아서 인스턴스를 만들어 줍니다.
public abstract Factory
{
public Student create(String name, String id)
{
Student stud = createStudent(name, id); // 생성을 위임
return stud;
}
public abstract Student createStudent(String name, String id);//핵심!!
}
이런 상위 팩토리추상클래스를 놓고(인터페이스로 선언하는것도 가능합니다.)
고딩을 만드는 팩토리
public class HighSchoolFactory extends Factory
{
public Student createStudent(String name, String id)
{
return new HighSchoolStudent(name, id); // 고딩
}
}
대딩을 만드는 팩토리
public class CollegeFactory extends Factory
{
public Student createStudent(String name, String id)
{
return new CollegeStudent(name, id); // 대딩
}
{
이렇게 두가지 팩토리 클래스가 있지요..
그러면 각자의 팩토리에 학생들을 등록시킬 수가 있겠죠..
Factory college = new CollegeFactory();
Factory highschool = new HighSchoolFactory();
Student john = college.create("John", "3433122"); // 대딩
Student jane = college.create("Jane", "2211343"); // 대딩
Student tom = highschool.create("Tom", "099933"); // 고딩
john.identify();
jane.identify();
tom.identify();
중요한 것은!!! 팩토리가 몇개냐, 팩토리가 어떤 타입의 클래스를 생성하느냐가 아니라 "팩토리에서 인스턴스를 만들어 준다. 인스턴스를 만드는 복잡한 과정을 과감하게 감춰준다."입니다.
(위에서 두개의 팩토리를 만들었는데 저것은 팩토리 패턴의 본질과는 아무 상관이 없는 예제일 뿐입니다.)
우리가 너무 큰 옷을 세탁소에 맡기면 그 옷이 반바지든 청바지든 빤스든 양말이든 알아서 척척 줄여주죠? 우리는 줄여야할 옷이랑 줄여야할 치수(요만큼 줄여주세요)만 알려주면 며칠 후 옷은 내몸에 딱 맞게 줄어서 돌아온다 이거죠.
위의 예제에서는 옷과 치수 대신 이름과 id 를 전달해주고 고딩공장에 전달해주면 고딩 객체가 생성되고 대딩공장에 전달해주면 대딩 객체가 만들어집니다.
이게 바로 팩토리 패턴입니다. ^^
ps. 위에 코드는 두서없이 생각나는데로 찍은거라 에러가 발생할 수 있으니까 실제로 돌려보시려면 에러 고치셔야 할듯..(문법 에러 정도가 있지 않을까 싶습니다.)
'fundamentale > design pattern' 카테고리의 다른 글
| MVC(Model-View-Controller) (0) | 2008/11/11 |
|---|---|
| Factory method pattern의 이해 (1) | 2008/11/11 |
| [펌] Abstract Factory Pattern - Builder Pattern 에 대한 이야기 (0) | 2008/10/21 |
| Observer Pattern - 디자인 패턴 (0) | 2008/01/24 |




댓글을 달아 주세요
ㅎㅎ 써니님의 글을 보고 다시보니,
2008/11/11 20:46 [ ADDR : EDIT/ DEL : REPLY ]올초 아무생각없이 퍼다 놓은 글이 논란의 여지가 되었군요,
Factory Method Pattern을 설명하기에는 조금 부족한 예제가 된것 같네요. ㅎㅎ