나는 최근에 특정 유형의 파일을 모델링하는 일부 개체를 포함하는 클래스 라이브러리를 작성했습니다. 예를 들어, 현재 누가 적절한 파생 클래스를 선택해야합니까?
길 클라이언트가 새로운 객체를 선택하여 쉽게 만들 등 (예WordDocument
및
ExcelDocument
콘크리트 유도 된 클래스를, 추상적) 파생 클래스
PdfDocument
(콘크리트) 및
OfficeDocument
추상
Document
클래스가 적절한 파생 클래스를 만들고 바이트 배열을 전달합니다.
var wordDocument = new WordDocument(wordDocumentByteArray);
var pdfDocument = new PdfDocument(pdfDocumentByteArray);
이 허용 디자인은 클라이언트가 사용하는 클래스를 파생 알고 있어야,이다 : 나는 PdfDocument과 WordDocument의 바이트 배열이있는 경우 그래서, 예를 들어, 내가 좋아하는 일을 할 것인가? 아니면 추상적 인 Document
클래스를 숨기고, 추상 팩터 리 패턴과 같은 것을 사용하여 올바른 파생 타입을 반환하는 것이 더 좋을까요? 예컨대 : 파생 유형이 추상 클래스에 추가 속성/메소드를 추가하지 않는 것이
var wordDocument = DocumentFactory.GetDocument(wordDocumentByteArray, "docx");
// pass file extension so we know what the file is
주, 그들은 단지 다른 방식으로 추상 메소드를 구현합니다.
확실히 두 번째 옵션입니다. 미래의 확장 성을 훨씬 용이하게하며,보다 적절한 새로운 유형이 추가 될 때 클래스 선언을 업데이트하는 데 소요되는 시간을 줄여줍니다. –
'Document' 클래스는 최종 사용자가 주어진'Document'로 처리해야하는 모든 것을 가지고 있습니까? 아니면 더 자주 파생 된 유형에 특정한 기능에 대한 액세스 가끔 필요합니까? – Servy
@Servy 네,'Document' 클래스는 하나의 public abstract 메소드를 가지고 있습니다. 파생 클래스는, 1 개의 public 메소드를 구현하는 목적으로, protected 및 private 헬퍼 메소드 (오버라이드 (override) 된 public 메소드를 더한 것)로만 구성됩니다. – Andrew