2010-01-23 5 views
1

인스턴스 생성을 직접 허용하지 않는 다양한 클래스가 있습니다. 오히려 다른 클래스의 정적 메서드에서 인스턴스를 만들어야하거나 정적 메서드를 소유해야합니다. 예를 들어 :일부 클래스가 직접 인스턴스화를 제한하는 이유는 무엇입니까?

B b = A.getB(); 

또는

B b = B.getInstance(); 

은 어떤 이유로 그 뒤에?

는 왜 같이 직접 인스턴스를 생성 허용하지 않습니다

B b = new B(); 

답변

7

일부 클래스는 인스턴스화 방법을 제어하고 공용 생성자를 보호하기를 원합니다. getInstance과 같은 정적 팩토리 메서드를 사용하면 해당 컨트롤을 자체 코드 내에서 유지할 수 있습니다.

이렇게하고 싶은 이유가 백만 가지 있습니다.

편집 : (예외가 발생하지 않는 한)이 new 운영자가 항상 새로운 인스턴스를 생성하기 때문에 귀하의 코멘트를 해결하기 위해,이 생성자 내부에서 수행 할 수 없습니다. 생성자가 호출 될 때까지 생성자의 코드가 객체의 인스턴스화 여부를 제어하기에는 너무 늦었습니다. 목표는 객체가 생성에 필요한 구조와 절차를 무시 할 수 있도록하는 것입니다 : 객체가 복잡한 생성 로직이있는 경우

+0

+1 생성자 자체에 해당 제어 코드를 쓸 수없는 이유를 말씀해주십시오. –

+0

수정 된 답변보기 – skaffman

4

사람들은 Singleton Pattern의 예이다. 그들은 일반적으로 개인 생성자 메서드를 가지고 있지만 예제에서는 내가 연결된 인스턴스화를 방지하기 위해 사용했습니다.

추상 클래스도 인스턴스화 할 수 없습니다.

+3

또는 FactoryPattern을 반환한다. –

+0

+1에 대한 링크 –

1

는 디자이너 대표단이이 single responsibility principle에 협정에 specific objects 에 생성 객체.

팩토리를 사용하지 않고 복잡한 객체를 만들려면 매개 변수가 너무 많은 긴 생성자가 필요합니다.

getInstance()의 경우 설계자는 자신의 응용 프로그램에서 액세스 할 수있는 객체의 단일 인스턴스 (예 : Singleton pattern)를 원했고 전역 변수와 같습니다.

1

두 가지 모두는 creational patterns의 구현 즉, 객체 생성 메커니즘을 처리하고 상황에 적합한 방식으로 객체를 만들려고하는 패턴 입니다.

  • 첫 번째 예는 Factory method pattern 다음과 같습니다 객체를 생성하기위한 인터페이스를 정의하지만, 서브 클래스가 인스턴스화하는 클래스를 결정할 수 있습니다. 팩토리 메소드를 사용하면 클래스가 하위 클래스 [Gof]에 대한 인스턴스 생성을 지연 할 수 있습니다.

  • 두 번째 예는 Singleton pattern : 클래스의 단일 인스턴스 만 만들 수있는 팩토리입니다.

그들은 그들이 정확하게 제어 목표로되기 때문에 new 직접 인스턴스를 생성하는 것을 허용하지 않습니다 생성이 특정 문제를 해결하기 위해 수행하는 방법 : 싱글을위한 하나의 객체에 클래스의 인스턴스를 제한을, 서브 클래스가 팩토리에 대해 인스턴스화 할 클래스를 결정하게합니다.

1

일부 사용 사례 : 객체의 인터페이스가 표시됩니다 팩토리 패턴

  1. 는, 구현 자체는 선택이 끝난 및 공장에 의해 변경 될 수 있습니다.
  2. 때 CreateInstance 방법은 항상 클래스가이 객체에 대한 싱글을 사용할 수있다 ctor에
  3. 내에서 수행 할 수없는 장면 뒤에 몇 가지 추가 작업이 동일한 인스턴스를
관련 문제