2009. 3. 6. 10:49

[생성 패턴] Simple Factory Pattern

몇 가지의 사용할 수 있는 클래스들 중 하나의 인스턴스를 반환한다.
그것들은 공통부모 클래스와 공통메소드를 갖지만,
 
다른 작업과 다른 종류의 데이터를 대상으로 최적화한다.
 

 

ex) 입력란에 성, 이름을 받아 그것을 유효한 성과 이름으로 나누어 저장한다.

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

- super class : 입력값에 대한 어떠한 연산 없이 변수 저장, child class에서 멤버변수를 사용하므로 protected로 설정한다.

public class Namer {
    //base class extended by two child classes
    protected String last;     //split name
    protected String first;    //stored here

    public String getFirst() {
        return first;           //return first nmae
    }
    public String getLast() {
        return last;            //return last name
    }
}

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

- child class1 : 인덱스로 짜른 첫 String이 성(First)라고 생각한다 공백으로 구분

public class FirstFirst extends Namer {
    //extracts first name from last name
    //when separated by a space
    public FirstFirst(String s) {
        int i = s.lastIndexOf(" "); //find sep space
        if (i>0) {
            first = s.substring(0, i).trim();
            last =s.substring(i+1).trim();
        } else {
            first = ""; // if no space
            last = s;   // put all in last name
        }
    }
}

- child class2 : 인덱스로 짜른 뒤 String이 성(First)라고 생각한다 , 으로 구분(미국사람들이 이렇게 쓰나 보다. 김 개똥 또는 개똥,김 이란 말이겠지.)

public class LastFirst extends Namer {
// extracts last name from first name
// when separated by a comma
    public LastFirst(String s) {
        int i = s.indexOf(","); //find comma
        if (i > 0) {
            last = s.substring(0, i).trim();
            first = s.substring(i + 1).trim();
        } else {
            last = s;       //if no comma,
            first = "";     //put all in last name
        }
    }
}

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

- Factory class

public class NamerFactory {
    //Factory decides which class to return based on
    //presence of a comma
    public Namer getNamer(String entry) {
        //comma determines name order
        int i = entry.indexOf(",");
        if (i > 0)
            return new LastFirst(entry);
        else
            return new FirstFirst(entry);
    }
}

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

return 받은 Namer 값은 first와 last 변수에 유효한 값이 저장되어 있으므로 어떤 클래스를 리턴하는지는 상관없이 클래스 인스턴스의 메소드를 호출할 수 있다.


'Design Patterns' 카테고리의 다른 글

[생성 패턴] 싱글톤(Singleton) 패턴  (0) 2009.02.04
2009. 2. 4. 14:21

[생성 패턴] 싱글톤(Singleton) 패턴

디자인 패턴에는 생성 패턴, 구조 패턴, 행위 패턴으로 나뉘며, 각 패턴마다 세부 패턴들로 다시 나눠진다.

싱글톤 패턴은 생성 패턴중의 하나로써 이름에서도 느낄수 있듯이 시스템에 해당 객체가 하나만 존재하도록 만드는 패턴이다. A라는 곳에서 변경한 객체내부의 데이터를 B라는 곳에서도 활용할수 있다.

싱글톤으로 만들고 싶은 클래스에 자기자신을 반환하는 메소드를 가지게 만든다. 그리고 사용자는 싱글톤 클래스를 이용하여 객체를 생성하는 것이 아니라, 싱글톤 클래스가 가진 메소드를 이용하여 객체를 얻는다.
싱글톤 메소드는 객체 내부에 하나의 객체만 만들어 둔 뒤, 이 객체를 반환해 주는 것이다.

싱글톤 클래스를 만드는 방법은 먼저 클래스 내부에 자기자신을 저장하는 static 멤버변수를 가지게 한다.

class Framework
    {
        private static Framework the_object;
                
        public static Framework get_object()
        {
            if (the_object == null)
            {
                the_object = new Framework();
            }
            return the_object;
        }
    }

싱글톤 객체를 반환하는 메소드를 사용하게 되면, 메소드는 제일 처음 한번만 객체를 생성하고  그 다음에는 이미 생성된 객체만 반환하는 작업을 하게 된다.

아랫 소스는 객체가 호출될 때마다 호출한 횟수를 출력할수 있다.

class Framework
    {
        private static Framework the_object;
        private string system_state;
        private static int num_invoke;

        public Framework()
        {
            the_object = this;
            num_invoke = 0;
            system_state = "대기";
        }

        public static Framework get_object()
        {
            if (the_object == null)
            {
                the_object = new Framework();
            }
            num_invoke++;
            Console.WriteLine("호출된 횟수 : " + num_invoke);
            return the_object;
        }
    }

책을 보면서 정리하고 소스도 돌려보고 하니깐 지금은 이해가 가는데 실전에서 쓸땐 과연... ㅋㅋㅋ

'Design Patterns' 카테고리의 다른 글

[생성 패턴] Simple Factory Pattern  (0) 2009.03.06