도메인 구동 설계에서 공장 패턴과 함께 Intrefaces를 어떻게 사용합니까?
-
05-07-2019 - |
문제
도메인 객체 공장에 기본적으로 인터페이스를 사용하는 것이 합리적입니까, 아니면 필요할 때만 공장 클래스에 인터페이스를 예약해야합니까?
public IUserFactory
{
User CreateNewUser();
}
public UserFactory : IUserFactory
{
public User CreateNewUser()
{
return new User();
}
}
해결책
다음은 동일한 문제를 Java로 번역 한 것입니다.
원래 예
public interface UserFactoryIF
{
User createNewUser();
}
그런 다음 공장의 구현
public class UserFactory implements UserFactoryIF
{
public User createNewUser()
{
// whatever special logic it takes to make a User
// below is simplification
return new User();
}
}
중앙 집중식 생산자를위한 단일 인터페이스를 정의하기 때문에 공장의 인터페이스를 정의하는 데 특별한 이점이 없습니다. 일반적으로 동일한 종류의 제품의 다양한 구현을 생산해야하며 공장은 다양한 종류의 매개 변수를 소비해야합니다. 즉, 우리는 다음과 같습니다.
public interface User
{
public String getName();
public long getId();
public long getUUID();
// more biz methods on the User
}
공장은 다음과 같습니다.
public class UserFactory {
public static User createUserFrom(Person person) {
// ...
return new UserImpl( ... );
}
public static user createUserFrom(AmazonUser amazonUser) {
// ... special logic for AmazonWS user
return new UserImpl( ... );
}
private static class UserImpl implements User {
// encapsulated impl with validation semantics to
// insure no one else in the production code can impl
// this naively with side effects
}
}
이것이 요점을 가로 지르기를 바랍니다.
다른 팁
주어진 예에서, 나는 당신이 왜 공장으로 가야하는지조차 알지 못합니다.
공장 패턴의 본질은 "객체 생성을위한 인터페이스를 정의하지만 서브 클래스가 인스턴스화 할 클래스를 결정하게하는 것입니다. 공장 방법을 사용하면 클래스가 서브 클래스로 인스턴스화를 연기 할 수 있습니다." - 위키 백과
다른 유형의 사용자가 있습니까? 아니면 사용자 자체가 무언가의 유형입니다. 당신이 그 일을 명확하게 정교하게하지 않았을 수도 있습니다. 우리는 보통 사용합니다 상호 작용 안에 추상 공장 방법 패턴, 우리는 여러 가족의 관련 대상을 처리 해야하는 곳입니다.
참고 : 잊지 마십시오. 패턴이 우리를 돕기 위해 패턴이 있다는 것은 우리가 필요하든 말든 사용할 수 있기 때문에 사용해야한다는 의미는 아닙니다.
모든 것이 인터페이스를 가질 필요는 없습니다. 단일 구현이 있고 다른 이유가 없다면 인터페이스를 정의하는 이유를 알 수 없습니다.
두 가지 : (1) 인터페이스를 만들기 전에 대체 구현을 필요로 할 때까지 기다릴 때까지 기다렸다가 (또는 2) 인터페이스가 거의 항상 단위 테스트, 특히 조롱으로 더 쉬워 지므로 자주 온다. 인터페이스가 바로 필요합니다.
인터페이스에서 공장을 작성하여 모의 클래스로 테스트 할 수 있으며 IOC 응용 프로그램을 사용하는 것이 더 간단하게 만들어 지므로 응용 프로그램 기능을 위해 반드시 필요하지는 않지만 일반적으로 인터페이스를 통해 대부분의 클래스를 빌드하고 호출합니다. .
단위 테스트 나 IOC 패턴 (종교적 의견을 제외하고)을 고려하지 않는다면 아마도 귀찮게하지 않을 것입니다.
비주얼 스튜디오에서 사용하는 데있어 가장 큰 고통은 적어도 속성이나 기능에 대한 '정의로 이동'이 클래스 정의가 아니라 인터페이스 정의로 점프한다는 것입니다.