2012-02-03 8 views
3

가능한 중복 : 나는 광장을 만드는 방법을 알고있는 공장 클래스가
Factory pattern in C#: How to ensure an object instance can only be created by a factory class?다른 클래스를 인스턴스화 할 수있는 클래스를 제한 할 수 있습니까?

가정하자. Factory 클래스 만 정사각형을 만드는 방법을 알고 있고 다른 사람들 (심지어 동일한 어셈블리에서도)이 정사각형을 만들지 못하도록하고 싶다고 생각한다면 올바른 (그런 것이 있다면) 방법이있을 것입니다.

+0

생성자를 private으로 만들고 팩토리 클래스를 중첩 된 Square로 만듭니다. http://stackoverflow.com/a/515288/ 284240 –

+1

감사의 말 Tim, 삼각형과 마름모꼴을 더하고 싶을 때 그렇게 잘 작동하지 않지만 ... –

답변

2

어셈블리와 클래스를 어셈블리로 옮기고 어셈블리의 내부에서 호출 할 수 있도록 클래스의 생성자를 내부로 표시 할 수 있습니다.

이렇게하면 다른 어셈블리 구성원이 팩터 리뿐만 아니라 생성자에도 액세스 할 수 있습니다.

예를 들어 Lookup<TKey, TElement>의 작동 방식입니다. 나는 (공장 및 같은 어셈블리의 Square와 함께)를 참조

+0

아마 내가 사용하게 될 해결책입니다. 누군가가 오용하는 경우 런타임에 예외를 던지기 위해 일부 리플렉션을 사용할 수 있는지 실제로 언젠가는 추측합니다. –

2

한 가지 방법은 Square 클래스의 정적 메서드로 팩토리 메소드를 이동하고 Square 클래스 만 개인 생성자를 추가하는 것입니다.

또한 Square의 내부 클래스로 Factory 클래스를 움직일 수 :

public class Square 
{ 
    private Square() 
    { 
    } 

    public int Size { get; set; } 

    public static class Factory 
    { 
     public static Square CreateClass() 
     { 
      return new Square { Size = 10 }; 
     } 
    } 
} 
5

상황에 따라, 당신이 할 수 있습니다 : 다음

public class Square 
{ 
    // Only Square and classes nested within it can call this 
    private Square() 
    { 
    } 

    public class Factory 
    { 
     public Square CreateSquare() 
     { 
      return new Square(); 
     } 
    } 
} 

:

Square.Factory factory = new Square.Factory(); 
Square square = factory.CreateSquare(); 
+1

내가 그렇게 할 예정이라면 스퀘어를 내면의 클래스로 삼아 서클과 삼각형에 대해서도 똑같이 할 수 있겠습니까? 이것은 분명히 나에게 거꾸로 보인다. 그러나 나는 누군가가 같은 대답을 올린 것을 본다. 그래서 내가 여기에 뭔가를 놓쳤다면 나를 궁금하게 만든다. –

+0

@BrandonMoore :이 경우에, 포함하는 클래스가 그렇지 않기 때문에 작동하지 않을 것이다. 중첩 클래스의 private 멤버에 액세스 할 수 있습니다. 보다 현실적인 시나리오를 알아야합니다. 기본적으로이 패턴은 유용합니다 (특히 Builder 패턴을 구현하는 데 유용합니다). 그러나 보편적으로 적용 가능한 것은 아닙니다. –

+0

아 맞아, 그걸 알았어. 이상하게도 필자는 내부 클래스가 외부 클래스의 private 멤버에 액세스하지 않아야한다고 사양에 따라 들었다고 생각합니다. 그러나 C# 및 기타 컴파일러는 유용하므로 어쨌든 허용합니다. –

관련 문제