Hoon222y

[1226-3] 추상 팩토리 패턴(abstractFactory) 본문

코딩/교육

[1226-3] 추상 팩토리 패턴(abstractFactory)

hoon222y 2018. 12. 27. 23:10

추상 팩토리 패턴 : 클래스를 인터페이스 기반으로 구현하여 결합 응집도를 낮춘 패턴

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package AbstractFactory;
 
public class Test1 {
    public static void main(String[] args) {
        //a.exe -os=win ...
        String os = "Win";  // =args[1]
 
        // 이제 각 운영체제 별로 정보창을 출력합니다.
        if (os == "Win") {
            WinTextBox textbox = new WinTextBox();
            WinButton button = new WinButton();
            textbox.draw();
            button.draw();
        }
        else if (os == "Linux") {
            GTKTextBox textbox = new GTKTextBox();
            GTKButton button = new GTKButton();
            textbox.draw();
            button.draw();
        }
        else {
            System.out.println("invalid os option");
        }
    }
}
// Windows의 GUI 컴포넌트
// -------------------------------------------------------------
class WinButton {
    // 각 컴포넌트는 자신이 어떻게 그려져야 할지를 가지고 있습니다.
    public void draw() {System.out.println("Windows Button"); }}
class WinTextBox {public void draw() {System.out.println("Windows TextBox"); }}
//Linux의 GUI 컴포넌트
//-------------------------------------------------------------
class GTKButton {public void draw() {System.out.println("GTKdows Button"); }}
class GTKTextBox {public void draw() {System.out.println("GTKdows TextBox"); }}
cs





1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package AbstractFactory;
 
// 이전의 코드는 각 운영체제에 따른 컴포넌트를 생성할 때, 컴포넌트의 이름을 직접적으로 사용하고 있습니다.
// 이는 객체 간의 결합도를 높이게 되므로 유지보수를 어렵게 합니다.
// 이제 객체 생성 코드르 감추기 위해 컴포넌트를 생성하는 공장을 도입하도록 합니다.
public class Test1 {
    public static void main(String[] args) {
        String os = "Linux";
 
        TextBox textbox = null;
        Button button = null;
 
        if (os == "Win") {
            // 운영체제별 컴포넌트 생성을 위해 공장 객체를 생성합니다.
            WinFactory factory = new WinFactory();
            textbox = factory.createTextBox(); //new WinTextBox();
            button = factory.createButton(); //new WinButton();
        }
        else if (os == "Linux") {
            GTKFactory factory = new GTKFactory();
            textbox = factory.createTextBox();
            button = factory.createButton();
        }
        else {
            System.out.println("invalid os option");
        }
        textbox.draw();
        button.draw();
    }
}
 
// 운영 체제별 컴포넌트 생성 공장 클래스를 설계합니다.
class WinFactory {
    // 컴포넌트 생성을 위한 메서드를 도입합니다.
    public Button createButton() { return new WinButton();    }
    public TextBox createTextBox() { return new WinTextBox();    }
}
class GTKFactory {
    public Button createButton() { return new GTKButton();    }
    public TextBox createTextBox() { return new GTKTextBox();    }
 
}
 
// 각 운영 체제별 컴포넌트를 하나의 타입으로 처리하기 위해 상속을 도입합니다.
abstract class Button {
    public abstract void draw();
}
abstract class TextBox {
    public abstract void draw();
}
 
// 각 컴포넌트는 해당 컴포넌트의 부모 클래스를 상속받기로 약속합니다.
class WinButton extends Button {
    public void draw() {System.out.println("Windows Button"); }
}
class WinTextBox extends TextBox {
    public void draw() {System.out.println("Windows TextBox"); }
}
 
class GTKButton extends Button {
    public void draw() {System.out.println("GTKdows Button"); }
}
class GTKTextBox extends TextBox {
    public void draw() {System.out.println("GTKdows TextBox"); }
}
cs




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
package AbstractFactory;
 
public class Test1 {
    public static void main(String[] args) {
        String os = "Linux";
        
        // 이처럼 공장 클래스를 인터페이스 기반으로 구현하여 결합 응집도를 낮춘 패턴을 추상팩토리 패턴이라고 합니다.
        Factory factory = null;
        
        if (os == "Win") {
            factory = new WinFactory();
        }
        else if (os == "Linux") {
            factory = new GTKFactory();
        }
        else {
            System.out.println("invalid os option");
        }
        TextBox textbox = factory.createTextBox();
        Button button = factory.createButton();
        textbox.draw();
        button.draw();
    }
}
// 이전 코드는 GUI 스타일이 이미 빌드 시점에 결정됩니다.
// 이 경우, 런타임에 GUI 스타일을 변경할 수 없게 됩니다.
// 이제 런타임에 GUI 스타일을 변경할 수 있도록 인터페이스를 도입합니다.
interface Factory {
    public Button createButton();
    public TextBox createTextBox();
}
// 이제 각 공장 클래스는 Factory 인터페이스를 구현합니다.
class WinFactory implements Factory {
    public Button createButton() { return new WinButton();    }
    public TextBox createTextBox() { return new WinTextBox();    }
}
class GTKFactory implements Factory {
    public Button createButton() { return new GTKButton();    }
    public TextBox createTextBox() { return new GTKTextBox();    }
}
abstract class Button {
    public abstract void draw();
}
abstract class TextBox {
    public abstract void draw();
}
// 각 컴포넌트는 해당 컴포넌트의 부모 클래스를 상속받기로 약속합니다.
class WinButton extends Button {
    public void draw() {System.out.println("Windows Button"); }
}
class WinTextBox extends TextBox {
    public void draw() {System.out.println("Windows TextBox"); }
}
class GTKButton extends Button {
    public void draw() {System.out.println("GTKdows Button"); }
}
class GTKTextBox extends TextBox {
    public void draw() {System.out.println("GTKdows TextBox"); }
}
cs


'코딩 > 교육' 카테고리의 다른 글

[1228] Secure Coding  (0) 2018.12.28
[1226-4] 전략(Strategy) 패턴 / 탬플릿 메소드 패턴  (0) 2018.12.27
[1226-2] 컴포지트 패턴  (0) 2018.12.27
[1227-3] 디자인 패턴 / 리팩토링  (0) 2018.12.27
[1227-2] 옵저버 패턴  (0) 2018.12.27
Comments