본문으로 바로가기

이번 시간에는 앞서 설명드렸던 부분에 진정한 추상 팩토리 패턴의 장점을 살펴보도록 합시다.

앞에서 설명한 것은 Main에서 이름별로 계속 바꿔줘야 했습니다.

이제 운영체제 별로 GUI를 생성해주는 코드를 통해 장점을 살펴봅시다.

우선 abst라는 추상 패키지를 만들어서 거기에 Gui를 생성해주는 GuiFac와 버튼인 Button, 글을 작성하는 부분인 TextArea 인터페이스들을 만들어 줍시다.

 

package abst;

public interface GuiFac {
	
	public Button createButton();
	public TextArea createTextArea();
	
}
package abst;

public interface Button {

	public void click();
}
package abst;

public interface TextArea {
	
	public String getText();
}

이제 이를 Win, Mac, Linux에서 구현합니다. 구현 클래스는 FactoryInstance클래스 내에서 구현해줄겁니다.

대표로 Win을 작성하겠습니다.

class WinButton implements Button{

	@Override
	public void click() {
		// TODO Auto-generated method stub
		System.out.println("윈도우 버튼 클릭");
	}
	
}
class WinGuiFac implements GuiFac {

	@Override
	public Button createButton() {
		// TODO Auto-generated method stub
		//리눅스 버튼 구현
		return new WinButton();
	}

	@Override
	public TextArea createTextArea() {
		// TODO Auto-generated method stub
		return new WinTextArea();
	}

}
class WinTextArea implements TextArea {

	@Override
	public String getText() {
		// TODO Auto-generated method stub
		return "윈도우 텍스트에이리어";
	}

}

그 다음 추상 팩토리 패턴의 가장 큰 장점인 FactoryInstance를 만들어줍시다.

이는 Main에서 

GuiFac fac = FactoryInstance.getGuiFac();

코드를 통해 직접 사용자가 이름을 변경하지않고 자동으로 OS 맞게 GUI를 생성해주는 코드를 작성합니다.(FactoryInstance.java)

 

package concrete;

import abst.Button;
import abst.GuiFac;
import abst.TextArea;


public class FactoryInstance {

	public static GuiFac getGuiFac() {
		

		// TODO Auto-generated method stub
		switch(getOsCode()) {
		case 0: return new MacGuiFac();
		case 1: return new LinuxGuiFac();
		case 2: return new WinGuiFac();
		
		}
		return null;
	}

	private static int getOsCode() {
		// TODO Auto-generated method stub
		if(System.getProperty("os.name").equals("Windows 10")) {
			return 2;
		}
		else if(System.getProperty("os.name").equals("Mac OS X")) {
			return 0;
		}
		else if(System.getProperty("os.name").equals("Linux OS")) {
			return 1;
		}
		return 0;
	}
	
}
class LinuxButton implements Button{

	@Override
	public void click() {
		// TODO Auto-generated method stub
		System.out.println("리눅스 버튼 클릭");
	}
	
}
class LinuxGuiFac implements GuiFac {

	@Override
	public Button createButton() {
		// TODO Auto-generated method stub
		//리눅스 버튼 구현
		return new LinuxButton();
	}

	@Override
	public TextArea createTextArea() {
		// TODO Auto-generated method stub
		return new LinuxTextArea();
	}

}
class LinuxTextArea implements TextArea {

	@Override
	public String getText() {
		// TODO Auto-generated method stub
		return "리눅스 텍스트에이리어";
	}

}
class MacButton implements Button{

	@Override
	public void click() {
		// TODO Auto-generated method stub
		System.out.println("맥 버튼 클릭");
	}
	
}
class MacGuiFac implements GuiFac {

	@Override
	public Button createButton() {
		// TODO Auto-generated method stub
		//리눅스 버튼 구현
		return new MacButton();
	}

	@Override
	public TextArea createTextArea() {
		// TODO Auto-generated method stub
		return new MacTextArea();
	}

}
class MacTextArea implements TextArea {

	@Override
	public String getText() {
		// TODO Auto-generated method stub
		return "맥 텍스트에이리어";
	}

}
class WinButton implements Button{

	@Override
	public void click() {
		// TODO Auto-generated method stub
		System.out.println("윈도우 버튼 클릭");
	}
	
}
class WinGuiFac implements GuiFac {

	@Override
	public Button createButton() {
		// TODO Auto-generated method stub
		//리눅스 버튼 구현
		return new WinButton();
	}

	@Override
	public TextArea createTextArea() {
		// TODO Auto-generated method stub
		return new WinTextArea();
	}

}
class WinTextArea implements TextArea {

	@Override
	public String getText() {
		// TODO Auto-generated method stub
		return "윈도우 텍스트에이리어";
	}

}

즉 인터페이스를 구현한  Linux, Mac, Window를 위 코드에 넣어주고 System.getProperty("os.name") 코드는 자신의 현재 운영체제를 출력해줍니다. 저는 Win 10이기 때문에 Windows 10이 출력됩니다.

 

이제 메인에서 

package main;

import abst.Button;
import abst.GuiFac;
import abst.TextArea;
import concrete.FactoryInstance;

public class Main {
	public static void main(String[] args) {
		//추상팩토리 패턴으로 이름만 바꿔주면 된다.
		//그러나 좀 더 편하게 instance를 이용해서 해보자. ==> 아래 코드 한줄로 모든 OS 컨트롤이 가능하다. 추상팩토리의 장점
		GuiFac fac = FactoryInstance.getGuiFac();

		Button button = fac.createButton();
		TextArea textarea = fac.createTextArea();
		
		button.click();
		System.out.println(textarea.getText());
	}
}

즉 GuiFac라는 추상팩토리를 통해서 운영체제별 인스턴스를 만들어주는 코드 1줄로도 모든 OS 컨트롤이 가능합니다.

추상팩토리 메소드의 장점이라고 할 수 있습니다.