태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.


Factory method pattern은 객체를 생성하는 인터페이스는 미리 정의하되, 인스턴스를 만들 클래스의 결정은 서브클래스 쪽에서 내리는 패턴이다. 팩토리 메서드 패턴에서는 인스턴스를 만드는 시점을 서브클래스로 미룬다.

http://ko.wikipedia.org/wiki/Factory_method_pattern


위와 같이, 객체 생성부분을 인터페이스로 정의하고, 인스턴스를 만들 클래스의 결정을 서브클래스에서 내리는 패턴이 팩토리 패턴이다.


아래는 ActionScript3로 작성된 예이다.

이전 포스팅에 있던 글역시 틀린글은 아니다. 하지만 논란의 여지가 있을뿐..


package factory

{
  public interface IProduct

  {
    function run():void;
  }
}



package factory

{
  public class ProductA implements IProduct
  {
    public function ProductA()
    {
      super();
    }

  
    public function run():void{
    
    }
  }
}





package factory
{

  public class ProductB implements IProduct
  {

    public function ProductB()
    {
      super();
    }

  
    public function run():void{
      
    }

  }
}



package factory
{
  public class IFactoryMethod
  {
    public function IFactoryMethod()
    {

    }
  }
}




package factory
{
  public class FactoryMethod extends IFactoryMethod
  {
    public static const PRODUCTA:String = "pa";

    public static const PRODUCTB:String = "pb";  

    public function FactoryMethod()
    {
      super();
    }

    public function getProduct(type:String):IProduct{
      var product:IProduct =  null;

      if(type == PRODUCTA){
        product = new ProductA();
      }else if(type == PRODUCTB){
        product = new ProductB();

      }
      return product;
    }
  }
}



<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
  <mx:Script>
    <![CDATA[

      import factory.FactoryMethod;

      import factory.IProduct;

      public function initApp():void{
        var f:FactoryMethod = new FactoryMethod();

        var p_a:IProduct = f.getProduct(FactoryMethod.PRODUCTA);
        var p_b:IProduct = f.getProduct(FactoryMethod.PRODUCTB);
      
        p_a.run();
        p_b.run();
      }
    ]]>
  </mx:Script>
</mx:Application>


--------------------------------------------------------------------------------------

이전 포스팅...


//------------------------------------------------------------------------------------

http://kin.naver.com/db/detail.php?d1id=1&dir_id=10106&eid=bhmDp3f8b5BvPNldyc2xoYd76VITSD7Q&qb=xtHF5LiuxtDFzw==

//------------------------------------------------------------------------------------

팩토리 패턴에서는 인스턴스의 생성을 팩토리에게 위임하는 형식이니까...

이름과 학번을 포함한 클래스를 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. 위에 코드는 두서없이 생각나는데로 찍은거라 에러가 발생할 수 있으니까 실제로 돌려보시려면 에러 고치셔야 할듯..(문법 에러 정도가 있지 않을까 싶습니다.)


Posted by THLIFE.net

TRACKBACK http://thlife.net/trackback/19 관련글 쓰기

  1. 써니의 생각  삭제

    2008/11/11 15:24TRACKBACK FROM sunnykwak's me2DAY

    팩토리 패턴을 쓰면서 팩토리 자체를 불필요하게 상속해서 구현하는 엉뚱한 예제 는 대체 어디서 비롯된 거여? 결합도를 낮추는 거라고 설명하는데, 실제로는 복잡도만 증가하지 않는가? 이런게 구글에서 가장 먼저 검색되다니…. 그나마 나은 예제

댓글을 달아 주세요

  1. ㅎㅎ 써니님의 글을 보고 다시보니,
    올초 아무생각없이 퍼다 놓은 글이 논란의 여지가 되었군요,

    Factory Method Pattern을 설명하기에는 조금 부족한 예제가 된것 같네요. ㅎㅎ

    2008/11/11 20:46 [ ADDR : EDIT/ DEL : REPLY ]