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