class Employee
{ //...
public void youAreFired()
{
// lots of code
}
}
인터페이스를 추가 , 구현한 클래스
interface Employee
{
void youAreFired();
}
class Peon implements Employee // used to be Employee
{
public void youAreFired()
{
// lots of code
}
}
이제 new를 사용하여 Employee를 생성했던 모든 부분을 바꾸어 주어야 한다.
쉬운 방법은 Employee emp = new Employee () => Employee emp = new Peon 이지만
이렇게 하면 인터페이스를 도입한 효과가 전혀없다. New를 제거하고 최소한 감추어야 한다.
(new 연산은 객체를 생성하는 클라이언트와 생성되는 객체를 결합 : 인터페이스나 클래스의 이름을 변경하면 많은 코드 수정필요)
=> Factory 패턴과 Singleton 패턴을 사용해서 문제를 해결하자
Factory 패턴을 객체 생성 시 인터페이스(Employee)를 통해 생성하려는 객체의 구체 타입(Peon)을 은닉시켜 준다.
생성된 객체를 사용하는 클라이언트는 인터페이스와만 결합 관계를 갖기 때문에 프로그램이 유연해진다.
즉 클라이언트 New Peon 대신 EmployeeFactory.create() 메소드를 이용하므로 Peon 객체와 직접 결합 관계를 맺지 않으며
향후 Peon이 아니 다른 Employee 인터페이스 구현제를 생성하고 싶다면 EmployeeFactory의 Create() 메소드만 수정해 주면 된다.
Abstract Factory Pattern을 이용해서 구현
public interface Employee
{
void youAreFired();
}
public static class EmployeeFactory
{
private Factory(){/*empty*/}
public static Employee create()
{
return new Peon();
}
}
/*package*/
class Peon implements Employee
{
public void youAreFired()
{
// lots of code
}
}
구체 클래스(Peon)의 접근 권한을 패키지로 한 것을 주의 깊게 보자.
Client가 Peon 객체를 EmpoyeeFactory.Create()를 통해 얻을 것이라 예상하므로 => New 를 최소화 하고
Peon을 Employee interface를 통해서만 접근할 수 있도록 하였다. => New를 감추었다.
public static class EmployeeFactory
{
private EmployeeFactory(){/*empty*/}
public static Employee create()
{
return new Peon();
}
private static class Peon implements Employee
{
public void youAreFired()
{
// lots of code
}
}
}
익명 내부 클래스로 팩토리 버전
.
public static class EmployeeFactory
{
private Factory(){/*empty*/}
public static Employee create()
{
return new Employee()
{
public void youAreFired()
{
// lots of code
}
}
}
}
Factory는 '유일성'과 '전역 접근'이란 조건을 만족시키므로 Singleton 패턴의 실체화라고 할 수 있다.
Static으로 EmployeeFactory를 선언 하고 Private 생성자를 사용하여 외부에서 객체를 생성하지 못하므로 한 객체만이 존재함을 보장
싱글톤에 대해서 더 자세히 들여다 보자 : http://paransilverlight.tistory.com/admin/entry/post/?id=220