이 공장 패턴이 아니다. 팩토리에는 항상 생성자 논리가 적어도 하나는 new
입니다. 그것이 공장의 아이디어입니다. 호출자는 객체가 어떻게 생성되는지 걱정할 필요가 없습니다. 이것은 싱글 톤 저장소입니다.
우선 배열을 사용하는 대신 형식 색인 사전이 있어야합니다.
private static Dictionary<Type, Feed> _singletons = new Dictionary<Type, Feed>();
그런 다음 등록 방법이 필요하지 않습니다. 사전 이 싱글 톤을 검색 할 때 자동으로 채워 져야합니다.
이제 피드 클래스에 인수없는 기본 생성자가 있다고 가정합니다. 그 경우, 추상 클래스 Feed로부터 직접 팩토리 메소드를 구현할 수 있습니다. 상속을 제어 할 수 있기 때문에 여기에 몇 가지 제네릭을 사용합니다.
public abstract class Feed
{
public static T GetInstance<T>() where T:Feed, new()
{
T instance = new T();
// TODO: Implement here other initializing behaviour
return instance;
}
}
이제 싱글 톤 저장소로 돌아갑니다. 난 당신이 싱글 작업 할 때 할 수있는 좋은 일이있는 스레드 동작을 포함
public class FeedSingletonRepository
{
private static readonly object _padlock = new object();
private static Dictionary<Type, Feed> _singletons = new Dictionary<Type, Feed>();
public static T GetFeed<T>() where T:Feed
{
lock(_padlock)
{
if (!_singletons.ContainsKey(typeof(T))
{
_singletons[typeof(T)] = Feed.GetInstance<T>();
}
return (T)_singletons[typeof(T)];
}
}
}
참고.이제 Feed
에서 상속 주어진 유형의 싱글을 얻으려면
(의이 SpecializedFeedType
를 호출하자), 당신이해야 할 모든은 다음과 같습니다
var singleton = FeedSingletonRepository.GetFeed<SpecializedFeedType>();
또는
SpecializedFeedType singleton = FeedSingletonRepository.GetFeed();
인 약간 다른 구문을 가진 같은 줄.
Edit2 : 일부 구문 오류가 변경되었습니다.
else 절에서 아무 것도하지 않으면 제거하는 것이 가장 좋습니다. 이렇게하면 더 쉽게 읽을 수 있습니다. –
이 답변보기 : http://stackoverflow.com/questions/4387573/can-i-use-attributes-so-my-factory-knows-what-it-can-should-instantiate-without-b/4387761#4387761 – Steven