아래 답변은 잘못되었지만 다른 사람들이 배울 수 있도록 계속하겠습니다 (아래 참조).
에서가 ExampleA
, 같은 사용할 수있는 Config
여러 클래스를 통해 인스턴스를. 그러나 Config
전체 애플리케이션 내에 인스턴스 가 하나만 있어야 Config
하는 경우 인스턴스가 여러 개인 것을 피 하려면 싱글 톤 패턴을 적용하는 것이 Config
좋습니다. 그리고 Config
Singleton 인 경우 대신 다음을 수행 할 수 있습니다.
class ExampleA
{
private $config;
public function __construct()
{
$this->config = Config->getInstance();
}
}
$exampleA = new ExampleA();
에서는 ExampleB
, 다른 한편으로는, 당신은 항상 별도의 인스턴스거야 Config
의 각 인스턴스를 ExampleB
.
적용해야하는 버전은 실제로 응용 프로그램이 다음 인스턴스를 처리하는 방법에 따라 다릅니다 Config
.
- 각 인스턴스가있는 경우
ExampleX
별도의 인스턴스가 있어야합니다 Config
, 함께 할 것입니다 ExampleB
;
- 의 각 인스턴스가
ExampleX
하나의 인스턴스 만 공유 Config
하는 경우 ExampleA with Config Singleton
;
- 의 인스턴스가있는 경우
ExampleX
의 다른 인스턴스를 사용할 수 있습니다 Config
, 스틱 ExampleA
.
싱글 톤Config
으로 변환 하는 것이 왜 잘못 됩니까 ?
어제 싱글 톤 패턴 에 대해서만 배웠다는 사실을 인정해야합니다 ( 헤드 디자인 패턴의 첫 번째 책 읽기 ). 순진하게 나는이 예제에 대해 적용했지만 많은 사람들이 지적했듯이 한 가지 방법은 다른 방법입니다 (일부는 더 비밀스럽고 "당신이 잘못하고 있습니다!"), 이것은 좋은 생각이 아닙니다. 따라서 다른 사람들이 방금했던 것과 같은 실수를 저 지르지 못하게하기 위해 Singleton 패턴이 유해 할 수있는 이유 (댓글 및 인터넷 검색 결과에 따라)를 요약 합니다.
경우 ExampleA
받는 사람 자체 참조 검색 Config
인스턴스를, 클래스가 밀접하게 결합됩니다. ExampleA
다른 버전 Config
(예 : 일부 서브 클래스) 을 사용 하는 인스턴스가있는 방법은 없습니다 . ExampleA
mock-up 인스턴스를 사용하여 테스트 Config
할 방법이 없기 때문에 테스트하려는 경우 끔찍합니다 ExampleA
.
거기의 전제는 인스턴스 하나와 하나가 될 것입니다 Config
어쩌면 보유 지금 ,하지만 당신은 항상 확신 할 수없는 같은 뜻을 잡고 미래에 . 나중에 여러 인스턴스 Config
가 바람직하다는 것이 밝혀지면 코드를 다시 작성하지 않고는 이것을 달성 할 수있는 방법이 없습니다.
유일무이 한 인스턴스 Config
가 영원 토록 사실 일지라도 일부 하위 클래스 Config
(여전히 하나의 인스턴스 만 있는)를 사용할 수 있기를 원할 수 있습니다 . 그러나 코드 는 메소드 인 getInstance()
of 를 통해 인스턴스를 직접 가져 오기 때문에 서브 클래스를 가져올 방법이 없습니다. 다시 코드를 다시 작성해야합니다.Config
static
사실 ExampleA
용도는 Config
단지의 API를 볼 때 적어도 숨겨집니다 ExampleA
. 이것은 나쁜 것이거나 아닐 수도 있지만 개인적으로 나는 이것이 불리한 느낌이라고 생각합니다. 예를 들어, 유지 관리 할 때 Config
다른 모든 클래스의 구현을 조사하지 않고 변경으로 인해 영향을받는 클래스를 찾는 간단한 방법은 없습니다 .
Singleton 을 ExampleA
사용 한다는 사실 자체가 문제가되지 않더라도 테스트 관점에서 여전히 문제가 될 수 있습니다. 싱글 톤 객체는 애플리케이션이 종료 될 때까지 지속되는 상태를 유지합니다. 하나의 테스트를 다른 테스트와 분리하기를 원할 때 (즉, 하나의 테스트를 실행해도 다른 테스트의 결과에 영향을 미치지 않아야 함) 단위 테스트를 실행할 때 문제가 될 수 있습니다. 이 문제를 해결하려면 각 테스트 실행 (전체 응용 프로그램을 다시 시작해야 함) 사이에 Singleton 개체를 삭제해야하며 시간이 오래 걸릴 수 있습니다 (지루하고 성가신 것은 말할 것도 없습니다). Config
이것을 말하면서, 나는 실제 응용 프로그램을 구현하지 않고 여기 에서이 실수를 저지른 것을 기쁘게 생각합니다 . 실제로 실제로 일부 클래스에 Singleton 패턴 을 사용하도록 최신 코드를 다시 작성하는 것을 고려 하고있었습니다. 변경 사항을 쉽게 되돌릴 수는 있지만 (물론 SVN에 모두 저장되어 있음) 여전히 시간을 낭비했을 것입니다.