2009-09-29 4 views
1

두 클래스가 있습니다. SpeciesReader은 파일을 가져 와서 파싱합니다. Species은 파일에서 파싱 된 종에 대한 특정 데이터를 저장합니다.Java : 하나의 클래스를 사용하여 다른 클래스의 객체 생성

현재 SpeciesReader.generateSpecies()은 인스턴스화 된 파일을 사용하여 Species 개체를 만듭니다. 이 나쁜 연습/디자인인가요? 어떻게 든 인수로 파일 이름을 사용하는 Species의 생성자로이 방법을 이동해야합니까?

+0

@Rosarch는 공장 태그를 추가했습니다. 이는 여러분이 가지고있는 것입니다. –

답변

7

전혀 아님. 이것은 공장이라고하는 일반적인 패턴입니다.

즉, 팩토리는 일반적으로 별도의 클래스가 아닌 클래스 자체 (이 경우에는 종)에서 구현되지만 그와 같이 분리하는 데는 아무런 문제가 없습니다.

이 책임이 종 (species)에 대신 있어야하는지 여부는 파일의 성격에 따라 다릅니다. 파일에 하나의 Species 만 있고 그 파일을로드하는 데 큰 오버 헤드가 없으면 Species를 Species의 일부로 만드는 것이 좋습니다.

그러나 파일에 많은 수의 파일이 있거나 초기화하는 데 비용이 많이 든다면 그 책임을 다른 클래스로 옮기고 Species 객체를 생성해야합니다.

선택하는 패턴이 사용 사례에 따라 달라 구현할 수 있지만, 김근삼입니다

+0

+1 공장 용 - 공장 패턴 –

0

이 몇 가지 패턴은 당신이 사용할 수 있습니다 올바른, 공장 좋은 선택 같다.

public class SpeciesFactory 
{ 
    private final static SpeciesFactory INSTANCE = new SpeciesFactory(); 

    private SpeciesFactory() { } 

    public static SpeciesFactory getFactory() 
    { 
     return INSTANCE; 
    } 


    public Species getSpecies(String filename) 
    { 
     Species species = null; 
     //do business logic 
     return species; 
    } 

} 

당신은 종 육식 = SpeciesFactory.getFactory()를 호출하여 사용하는 것이 getSpecies ("carnivore.txt.");

+0

에서 추가 자료를 읽을 수있는 링크를 추가하는 것이 좋습니다. SpeciesFactory.getSpecies()가 아닌 이유는 무엇입니까? (정적으로 만들기) –

+0

일반적으로 정적 메서드 사용을 피하려고합니다. 위의 예에서 JVM에는 SpeciesFactory 인스턴스가 하나만 있고 singleton INSTANCE는 하나의 팩토리 만 인스턴스화된다는 것을 확인합니다. 객체 참조에 관계없이 수종 접근 자의 특정 종을 캐시하려면 어떻게해야합니까? 정적 메서드 나 public 생성자가있는 Util 클래스를 사용하여이를 수행하지 않으려합니다. – Droo

0

당신이 가지고있는 것은 Factory Method Pattern의 예입니다. 이 creational pattern은 경우에 따라 잘 사용될 수 있습니다. 내 개인적인 취향 그러나 그것을 시도하고 그것을 사용하기 위해보다 독창적 인 ctor 교체 및 그 안에 지나치게 복잡한 아무 것도하지 마십시오. 이것은이 팩토리에 의존하는 클래스의 테스트를 단순화하기위한 것입니다.

복잡한 구조의 무언가에 대해서는 Abstract Factory을 사용합니다. 이 방법을 사용하면 파일이 많이 생성되지 않고 해당 팩토리에 대한 종속성이있는 구성 요소를 테스트 할 수 있습니다.

위의 경우 Singleton을 공장에서 정적 방법으로 사용하는 것에 대해 질문합니다. 이것에 대한 나의 견해는 다음과 같다 : 정적 방법은 읽을 수있는 ctors에 유용하며, 싱글 톤은 unit testing에 대한 선호도를 가진 누구에게나 좋은 자극이다.

0

파일의 구문 분석과 해당 파일에서 구문 분석 된 개체의 구현을 구분하는 것이 좋습니다. 이것은 "분리의 우려"로 알려져 있습니다. 종의 구현은 그것이 영구 저장 장치 (OO 설계 전문 용어에서 "지속성 불가지론"이어야 함) 또는 생성자에 전달 된 매개 변수가 어디서 왔는지를 알거나 신경 쓰지 않아야합니다. 일단 생성 된 후에는 시스템의 다른 객체와 어떻게 상호 작용하는지에 대해서만주의해야합니다.Species가 Persistent Storage에 어떻게 표현되는지에 대한 관심은 SpeciesReader에서 다른 곳에서 구현되어야합니다.

0

오브젝트를 지속되는 방식과 분리하는 것이 더 좋은 방법입니다. - 바이너리 파일, XML 파일, 데이터베이스 레코드, 네트워크 소켓 등에서 여러 종류의로드 방법이 있다고 상상해보십시오. 빈약 한 종은 프로그램의 모든 부분을 알고 싶지 않습니다.

관련 문제