본문 바로가기
Spring/DesighPattern

GOF패턴-AbstractFactoryPattern

by windy7271 2023. 2. 23.
728x90
반응형

AbstractFactoryPattern

관련 있는 객체의 생성을 가상화한다.

 

 

factory 부분을 가상화 /

client 가상화된 product를 가지고 활용하는 패턴

 

 

AbstractFactoryPattern

 

 

  • 팩토리 메서드 패턴은 실제 팩토리를 구현하는 인스턴스를 만들 때 상위 클래스를 확장하고 팩토리 메서드를 오버라이드 하여 상속을 통해 인스턴스를 생성하였다.
  • 하지만 추상 팩토리 패턴은 AbstractFactory를 Interface 타입으로 생성하고 그 인터페이스를 실체화하여 객체를 생성하는 것이다.

 

Button, Text > AbstractProdct

GuiFactory = > 실제생성해야 할 Product

~~~GuiFac =>  ConcreateFactory   AbstractProduct를 구현한 각 운영체제의 button, text인 Prodduct를 생성하여 리턴해준다.

 

 

-GuiFactory

package AbstractFactory2.abs;

public interface GuiFactory {

    public Button createButton();
    public TextArea createTextArea();

}

 

- ConcreateFactory >>  Button과 Text인 Product들을 생성하여 리턴

package AbstractFactory2.mac;

import AbstractFactory2.abs.Button;
import AbstractFactory2.abs.GuiFactory;
import AbstractFactory2.abs.TextArea;

public class MacGuiFactory implements GuiFactory {
    @Override
    public Button createButton() {
        return new MacButton();
    }

    @Override
    public TextArea createTextArea() {
        return new MacTextArea();
    }
}

Button, Text 추상화

package AbstractFactory2.abs;

public interface Button {
    public void click();
}
package AbstractFactory2.abs;

public interface TextArea {
    public String getText();
}

 

 

prodcut 

package AbstractFactory2.mac;

import AbstractFactory2.abs.Button;

public class MacButton implements Button {
    @Override
    public void click() {
        System.out.println("mac button");
    }
}
package AbstractFactory2.mac;

import AbstractFactory2.abs.TextArea;

public class MacTextArea implements TextArea {
    @Override
    public String getText() {
        return "mac TextArea";
    }
}

 

 

factory instance  

위 예시는 Mac 일 경우이다. 하지만 맥 윈도우 리눅스 이렇게 늘어난다면 아래처럼 들어오는 값에 따라 생성해야하는 객체가 다르다.

 

아래 경우는 팩토리 인스턴스를 만들어서

public class FactoryInstance {


    public static GuiFactory getGuiFac() {
        switch (2){
            case 0 : return new MacGuiFactory();
            case 1 : return new WinGuiFactory();
            case 2 : return new LinuxGuiFac();
        }
        return null;
    }
    private static int getOsCode(){
        if(System.getProperty("os.name").equals("Mac OS X")){
            return 0;
        }
        return 1;
    }

}
class LinuxButton implements Button {
    @Override
    public void click() {
        System.out.println("Linux Button");
    }
}
class LinuxGuiFac implements GuiFactory {
    @Override
    public Button createButton() {
        return new LinuxButton();
    }

    @Override
    public TextArea createTextArea() {
        return new LinuxTextArea();
    }
}
class LinuxTextArea implements TextArea {
    @Override
    public String getText() {
        return "linux TextArea";
    }
}

직접 버튼,텍스트에리아 팩토리까지 한번에 다 넣어도 된다, 윈도우 맥도 마찬가지 

 

 

public class Main {
    public static void main(String[] args) {
        GuiFactory guiFac = FactoryInstance.getGuiFac();
        Button button = guiFac.createButton();
        TextArea textArea = guiFac.createTextArea();

        button.click();
        System.out.println("textArea = " + textArea.getText());
        System.out.println(System.getProperty("os.name"));
    }
}

이 코드를 돌리면 지금 2번이 들어가있기때문에 리눅스 관련으로 나온다.

getOsCode()
private static int getOsCode(){
        if(System.getProperty("os.name").equals("Mac OS X")){
            return 0;
        }
        return 1;
    }

자기 컴퓨터가 리눅스인지 윈도우인지 나온다.

나는 mac이므로 0을 리턴하게 했다 . 이렇게 바꿔놓고 돌리면 0을 리턴받아 mac 관련으로 나온다.

반응형

댓글