본문 바로가기
Tech/Java

Factory Design Pattern

by Augustine™ 2019. 3. 18.
반응형

Factory Design Pattern 이란

Factory Design Pattern은 객체지향 디자인 패턴의 일종으로, 상위(슈퍼) 클래스가 객체 생성에 대해 신경 쓸 필요가 없으며, 객체의 생성은 구현 클래스에게 위임하는 패턴이다. 즉, 객체의 생성을 서브 클래스에 위임하는 것으로, 객체를 만들어내는 공장(Factory 객체)을 만드는 패턴으로 이해하자.


Factory Design Pattern 의 이점

1. 팩토리 메소드 패턴은 클래스간의 결합도를 낮출 수 있기 때문에, 더 유연하고 확장이 용이한 코드를 만들 수 있다.

결합도란 소프트웨어 코드의 한 요소가 다른 것과 얼마나 연결되어 있는지, 또는 의존되어 있는지 나타내는 척도이다. 높은 결합도가 문제가 되는 이유는 다음과 같다. 

  • 연관된 다른 클래스가 변경되면 변경이 필요함
  • 수정하려는 클래스를 이해하기 위해 연관된 다른 클래스도 이해가 필요함
  • 추후 애플리케이션간 인터페이스를 위해 높은 결합도로 인한 클래스의 재사용이 힘들기 때문

2. Factory 패턴은 직접 객체를 생성해서 사용하는 것을 방지하고, 객체의 생성을 서브 클래스에 위힘하므로, 보다 효율적인 코드 제어가 가능하다.


Factory Design Patter 의 예제

여기서 구현할 예제는 상위 클래스인 Computer 와 하위 클래스인 PC, Server을 만들어서, 이 들간의 유연한 관계를 핸들링하는 ComputerFactory 클래스를 만들것이다.

먼저 Computer 클래스는 PC와 Server의 추상화 클래스로 아래와 같다.


package com.augustine.pattern.factory;

public abstract class Computer {

	public abstract String getRam();
	public abstract String getHdd();
	public abstract String getCpu();
	
	@Override
	public String toString() {
		return "Computer [getRam()=" + getRam() + ", getHdd()=" + getHdd() + ", getCpu()=" + getCpu() + "]";
	}
	
}


그리고 하위 클래스인 PC와 Server 클래스를 만들자.


package com.augustine.pattern.factory;

public class PC extends Computer {

	private String ram;
	private String hdd;
	private String cpu;
	
	
	public PC(String ram, String hdd, String cpu) {
		super();
		this.ram = ram;
		this.hdd = hdd;
		this.cpu = cpu;
	}

	@Override
	public String getRam() {
		// TODO Auto-generated method stub
		return this.ram;
	}

	@Override
	public String getHdd() {
		// TODO Auto-generated method stub
		return this.hdd;
	}

	@Override
	public String getCpu() {
		// TODO Auto-generated method stub
		return this.cpu;
	}

}



package com.augustine.pattern.factory;

public class Server extends Computer{

	private String ram;
	private String hdd;
	private String cpu;
	
	public Server(String ram, String hdd, String cpu) {
		super();
		this.ram = ram;
		this.hdd = hdd;
		this.cpu = cpu;
	}
	
	@Override
	public String getRam() {
		// TODO Auto-generated method stub
		return this.ram;
	}

	@Override
	public String getHdd() {
		// TODO Auto-generated method stub
		return this.hdd;
	}

	@Override
	public String getCpu() {
		// TODO Auto-generated method stub
		return this.cpu;
	}

}


이제 이들을 핸들링할 Factory 클래스를 만들자.


package com.augustine.pattern.factory;

public class ComputerFactory {

	public static Computer getComputer(String type, String ram, String hdd, String cpu) {
	
		if("PC".equalsIgnoreCase(type)) return new PC(ram, hdd, cpu);
		else if("Server".equalsIgnoreCase(type)) return new Server(ram, hdd, cpu);
		
		return null;
	}
	
}


위에서 만든 Factory Design pattern을 테스트할 간단한 예제 코드를 만들어보자.


package com.augustine.pattern.factory;

public class TestFactory {

	public static void main(String[] args) {
		Computer pc = ComputerFactory.getComputer("pc", "2 GB", "500 GB", "2.4Ghz");
		Computer server = ComputerFactory.getComputer("Server", "16 GB", "1TB", "2.9 Ghz");
		System.out.println("Factory PC Config : "+pc);
		System.out.println("Factory Server Config : "+server);
	}
}


우리가 예제에서 구현한 코드를 살펴보면, 객체를 직접 생성하지 않고, Factory 클래스의 static  getComputer메소드를 이용하여 객체 생성을 위임하였다. 객체 생성의 위임으로 코드의 결합도를 낮추어서 프로그램의 확장이 용이해진 것을 알 수 있다.


구현한 패턴을 UML로 표현하자면 아래와 같다.



반응형

'Tech > Java' 카테고리의 다른 글

Java command line의 Arguments에 대해 알아보기  (2) 2019.08.13
Abstract Factory Design Pattern  (0) 2019.03.20
Singleton Design Pattern  (0) 2019.03.14
Observer Design Pattern  (0) 2019.03.14
Selenium WebDriver  (0) 2019.03.07

댓글