728x90
반응형
AbstractFactoryPattern
관련 있는 객체의 생성을 가상화한다.
factory 부분을 가상화 /
client 가상화된 product를 가지고 활용하는 패턴
- 팩토리 메서드 패턴은 실제 팩토리를 구현하는 인스턴스를 만들 때 상위 클래스를 확장하고 팩토리 메서드를 오버라이드 하여 상속을 통해 인스턴스를 생성하였다.
- 하지만 추상 팩토리 패턴은 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 관련으로 나온다.
반응형
댓글