2011-03-13 6 views
1

초기화 할 필요가있는 클래스가 있으므로 작업을 시작할 수 있습니다. 그러나, 내 개체 내에서 그것을 만들고 싶지 않아, 나는 그것을 주입하고 싶다 - 그래서 나는 init()과 run()을 둘 다 가질 필요가있다.OOP 디자인 : 상태 피하고 의존성 주입 유지

그러나 문제가 발생합니다. 개체에 상태가 있고 피하려고합니다. 이 상황을 극복하기위한 설계 패턴이 있습니까?

+0

모든 객체 지향 설계는 클래스에 전역 변수가없고 모든 로컬 변수가 '최종'으로 선언되지 않으면 반드시 상태 저장이됩니다. –

+0

@Travis 그게 좋은 지적이지만, 당신이 묘사하는 근본적인 방식으로 그것을 의미하지는 않았다 - 나는 그것이 더 상태 머신과 같은 것을 의미했다 - 당신은 A를하지 않고는 B를 할 수 없으며, – Yossale

답변

4

의존성 주입 : 의존성 주입은 논리의 구현을 클래스로 전달하기위한 멋진 용어입니다. 의존성 주입의 가장 기본적인 형태는 constructor입니다. 생성자에 대한 매개 변수로서 클래스 내부에 있기를 원하지 않는 모든 것의 인스턴스를 전달하기 만하면됩니다.

public interface Logic 
{ 
    public void do(); 
} 

public class MyClass 
{ 
    private final Logic logic; 

    public MyClass(final Logic logic) 
    { 
     this.logic = logic; 
    } 

    public void doLogic() { this.logic.do(); } 
} 

public class MyLogic implements Logic 
{ 
    public void do() { /* custom logic goes here */ } 
} 

public class Main 
{ 
    public static void main(final String[] args) 
    { 
     final MyClass myClass = new MyClass(new MyLogic()); 
     myClass.doLogic(); 
    } 
} 

건물 클래스 : 좋은 방법은 클래스가 완전히 구성 및 초기화되는 것을 보장하기는 FactoryMethod 패턴이다. static MyClass create(); 메서드를 만들고 MyClass 생성자를 private으로 만들고 클래스를 초기화하고 전달하기 전에 클래스가 유효한지 확인하십시오.

+0

그건 좋은 해결책이지만, 전체 문제를 해결하지 못합니다. 클래스 A를 클래스 B 외부에서 생성 한 다음 생성자에서 B로 전달하려고합니다. 그러나 클래스 A는 여전히 클래스 B에서 초기화해야합니다 (오직 그는 필요한 가치를 안다). – Yossale

+0

** 죄책감은 없지만 정말 좋지 않은 디자인입니다. ** 다른 클래스에서 구성하지 않으면 사용할 수없는 클래스를 만드는 점은 무엇입니까? 이는 OOA/OOD의 모범 사례 규칙을 망가 뜨립니다. 클래스 A가 클래스 B의 공용 내부 클래스가되도록하는 것이 더 나은 설계입니다. 따라서 클래스 B는 모든 클래스 A 인스턴스의 인스턴스화 및 구성을 제어 할 수 있습니다. FactoryPattern의 또 다른 용도는 당신이 설명하는 것입니다. 클래스 A의 여러 구현이 필요하다면 공통 인터페이스를 가지며 클래스 B의 모든 Implemenations 내부 클래스를 갖습니다. –

0

이 경우에는 생성자 인수로 의존성을 제공해야하는 것처럼 들립니다. 이렇게하면 final 키워드를 첨부하여 안전성이 향상되므로 절대 다시 설정할 수 없습니다.