OOP/Design Pattern

[OOP] 추상 팩토리 패턴(Abstract Factory Pattern)

IT록흐 2022. 11. 13. 23:12
반응형

 

디자인 패턴이란?

객체지향설계 과정에서 발생하는 문제들을 해결하기 위한 패턴(Pattern)

 

문제 상황

결합도를 낮추기 위해 인터페이스를 사용하지만 구현객체를 생성(new)하는 과정에서 결합이 발생할 수 밖에 없다. 이때 new 객체 생성 권한을 Factory 클래스에게 넘겨주므로써 객체 간 결합도를 낮출 수 있다.

 

서버에 특정 파일을 배포, 백업, 삭제하는 프로그램을 만든다고 가정해보자.

 

 

 

 

Deploy, Backup, Remove는 모두 각각의 Machine 객체와 결합되어진다. 이같은 구조는 소스중복으로 이어지고 기능이 추가될 경우 유지보수에도 좋지 못하다. 그래서 도입된게 바로, 인터페이스이다. 

 

 

 

 

Machine 인터페이스로 인하여 결합도는 낮아졌지만 아직도 조금의 결합도가 있다. 

 

public class DeployMain{
	public static void main(String[] args){
		Machine mahine = new DeployMachine(); // 배포Machine 과 결합
		machine.execute();
	}
}

public class BackupMain{
	public static void main(String[] args){
		Machine machine = new BackupMachine(); // 백업Machine 과 결합
		machine.execute();
	}
}

public class RemoveMain{
	public static void main(String[] args){
		Machine machine = new RemoveMachine(); // 삭제Machine 과 결합
		machine.execute();
	}
}

 

 

인터페이스의 구현객체를 생성(new)하면서 Deploy, Backup 그리고 Remove는 각각의 구현객체와 결합하게 된다. 이로인해 Main 함수 로직도 3개나 필요하다.  이는 new 연산자 즉, 객체 생성 권한이 main에게 있기 때문이다. 만약 해당 권한을 다른 객체(Factory)에 넘겨준다면 결합도는 현저히 낮아진다.

 

 

 

 

 

이와 같이, Factory 클래스를 하나 만들어 객체 생성 권한을 위임할 것이다. 

 

public class MachineFactory{ 
	private static final DEPLOY = 0; // 각 상태는 Enum 클래스로 구현하면 더 깔끔해지니 참고!
	private static final BACKUP = 1;
	private static final REMOVE = 2;

	public Machine getMachine(int key){
		switch(key){
			case 0 : return new DeployMachine(); // 객체 생성
			case 1 : return new BackupMachine(); // 객체 생성
			case 2 : return new RemoveMachine(); // 객체 생성
			default : return null; 
		}
	}
	
}

 

 

getMachine() 메소드는 원하는 객체를 key로 명시하면 해당 객체를 대신 생성해서 return으로 넘겨준다. 이는 결합도를 엄청나게 낮추어 준다. 

 

public class DeployMain{
	public static final int key = MachineFactory.DEPLOY; // KEY
    
	public static void main(String[] args){
		MachineFactory mahineFactory = new MachineFactory();
		Machine machine = mahineFactory.getMahine(key);
		machine.execute();
	}
}
public class BackupMain{
	public static final int key = MachineFactory.BACKUP; // KEY

	public static void main(String[] args){
		MachineFactory mahineFactory = new MachineFactory();
		Machine machine = mahineFactory.getMahine(key);
		machine.execute();
	}
}

public class RemoveMain{
	public static final int key = MachineFactory.REMOVE; // KEY

	public static void main(String[] args){
		MachineFactory mahineFactory = new MachineFactory();
		Machine machine = mahineFactory.getMahine(key);
		machine.execute();
	}
}

 

 

배포, 백업, 삭제 기능이 key 값을 제외하고 모두 동일해졌다. 결합되어 있던 구현객체 생성을 Factory 클래스가 가져가면서 결합도가 낮아진 것이다. 그러므로 아래와 같이 코드가 확 줄어든다. 

 

public class Main{
	public static final int key = MachineFactory.DEPLOY;
	// public static final int key = MachineFactory.BACKUP;
	// public static final int key = MachineFactory.REMOVE;
	
	public static void main(String[] args){
		MachineFactory mahineFactory = new MachineFactory();
		Machine machine = mahineFactory.getMahine(key);
		machine.execute();
	}
}

 

 

더 이상 배포, 백업, 삭제 세 가지 로직이 필요없다. 단순히 원하는 작업을 key값으로 던져주면 된다. 이와 같이, 추상 팩토리 패턴은 객체 생성권한을 넘겨줌으로써 객체 간 결합도를 낮추는 방법이다. 

 

 

 


 

 

참고자료

 

JAVA 객체지향 디자인 패턴 : 네이버 도서

네이버 도서 상세정보를 제공합니다.

search.shopping.naver.com

 

반응형