2013-05-11 33 views
5

Gần đây, tôi đã làm việc với các trình phân tích cú pháp XML. Điều này chỉ mới bắt đầu với tôi và tôi đã hiểu cách sử dụng các lớp trình phân tích cú pháp DOM trong java tức là DocumentBuilderFactoryDocumentBuilder để phân tích cú pháp tài liệu XML.Làm thế nào để một lớp trừu tượng "DocumentBuilderFactory" được phép tạo nhanh cá thể mới

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
DocumentBuilder db = dbf.newDocumentBuilder();    

Những gì tôi đang tự hỏi là làm thế nào đến một lớp trừu tượng, chẳng hạn như DocumentBuilderFactoryDocumentBuilder, được phép để nhanh chóng các trường hợp mới? Và sau đó trong một ví dụ khác tôi thấy:

Calendar calendar = Calendar.getInstance(); 
System.out.println(calendar.get(Calendar.DATE)); 
  1. Theo như tôi biết, bạn không thể nhanh chóng (nói cách khác, tạo ra một đối tượng) cho các lớp trừu tượng và giao diện. Tôi có đúng không?
  2. Các phương pháp getInstance()newInstancce() có tạo ra các thể hiện của các lớp trừu tượng ở trên không?

Tôi có thiếu gì đó về việc sử dụng lớp trừu tượng và đối tượng mới của nó không?

Trả lời

9

Phương thức đó là abstract factory method, trả về một lớp con của DocumentBuilder, là một triển khai (cụ thể).

Lớp chính xác của đối tượng không quan trọng cần biết, bạn chỉ cần biết rằng đó là DocumentBuilder. Phương thức này có thể trả về một cá thể được quyết định trong thời gian chạy, hoặc được xác định trước khi nó thấy phù hợp.

Nếu bạn tò mò muốn biết, bạn có thể in ra các lớp học thực tế như thế này:

System.out.println(dbf.getClass()); 

Lưu ý rằng phương pháp newInstance() không phải là để bị nhầm lẫn với các phương pháp cùng tên của Class , nghĩa là hai số này khác nhau:

// a static method of this class 
DocumentBuilderFactory.newInstance(); 

// an instance method of Class 
DocumentBuilderFactory.class.newInstance(); 

Một sự lựa chọn không chắc chắn về tên chắc chắn gây nhầm lẫn.

+0

tôi có thêm chút ít cho câu hỏi của tôi . – MKod

+0

@Bohemian chỉ curios .. lớp DocumentBuilderFactory chắc chắn có thể được xem như là một AbstractFactory vì nó cho thấy các phương thức như newDocumentBuilder để trả về các cá thể đối tượng khác. Tuy nhiên DocumentBuilderFactory.newInstance() là nhiều hoặc ít hơn một phương pháp nhà máy tĩnh –

+0

Tôi đã nhận nó, tôi đã xem xét nguồn. cảm ơn đã giúp đỡ. – MKod

3

Đó là một tĩnh phương pháp nhà máy trừu tượng, mà sẽ trả về một subtype của DocumentBuilderFactory không phải là ví dụ thực tế của DocumentBuilderFactory itself.It không giống như những gì tôi đoán, bạn hiểu:

DocumentBuilderFactory dbf = new DocumentBuilderFactory(); 

DocumentBuilderFactory#newInstance(), Có được một thể hiện mới của một DocumentBuilderFactory. Phương thức tĩnh này tạo ra một cá thể nhà máy mới. Phương pháp này sử dụng thủ tục tra cứu đơn đặt hàng sau để xác định lớp triển khai DocumentBuilderFactory để tải.

newInstance() sẽ trả về một thể hiện của lớp thực hiện (subtype) của DocumentBuilderFactory, mà không phải là trừu tượng và sẽ gán tham chiếu đến đối tượng đó để biến DocumentBuilderFactory tham khảo.

+0

Chính xác tôi giả sử: DocumentBuilderFactory dbf = new DocumentBuilderFactory(); . Khi bạn nói "nó sẽ trả về kiểu con", tôi thích biết lớp con. xin lỗi tôi gần như có nhưng sự tinh tế là hơn suy nghĩ của tôi. – MKod

+0

Không, không phải, đi qua mã nguồn! – NINCOMPOOP

+0

tôi hiểu rồi, tôi đã nhìn vào nguồn. cảm ơn đã giúp đỡ. – MKod

1

Đó là một phương pháp tĩnh. Bạn có thể gọi các phương thức trừu tượng tĩnh (hoặc bất kỳ lớp nào cho vấn đề đó) mà không tham chiếu đến một cá thể.

+0

rất đúng.thanks Dev – MKod

1

Cảm ơn tất cả mọi người, sau khi thử bên dưới mã, sự nghi ngờ của tôi đã bị xóa.

Lịch cls = Calendar.getInstance();
Ngày dt = new Date();
System.out.println (cls.getClass()); // < ------ 1
DocumentBuilderFactory dbls = DocumentBuilderFactory.newInstance(); System.out.println (dbls.getClass()); // < ------ 2
DocumentBuilder db = dbls.newDocumentBuilder();
System.out.println (db.getClass()); // < -------- 3

Và tôi nhìn thấy đầu ra follwoing:

a) Phương pháp tĩnh "DocumentBuilderFactory.newInstance()" trả về lớp kiểu phụ dụ gọi là "DocumentBuilderFactoryImpl ".

b) "DocumentBuilderFactoryImpl" là một lớp con của lớp trừu tượng "DocumentBuilderFacotory", do đó không có vấn đề nếu tôi cung cấp:

DocumentBuilderFacotryImpl dbls = DocumentBuilderFactory.newInstance();
// ----- Thay vì đưa DocumentBuilderFactory dbls = DocumentBuilderFactory.newInstance();

và cùng áp dụng cho DocumentBuilderImpl db = dbls.newDocumentBuilder();
// ---- Thay vì DocumentBuilder db = dbls.bewDocumentBuilder();

Kết luận: newInstance(), newDocumentBuilder(), getInstance() trả về đối tượng lớp con. Mặc dù lớp trừu tượng không thể tạo đối tượng mới, chúng ta có thể gán đối tượng lớp con cho biến tham chiếu lớp trừu tượng (tức là minh bạch). ví dụ:

Abstract class A { }
lớp B kéo dài A { }

chúng ta có thể nói:

A a = new B(); 

nhưng không

A a = new A(); 
+0

Vâng, tôi nghĩ bạn đã tìm ra. – Bohemian

+0

+1, để tìm ra! – NINCOMPOOP

Các vấn đề liên quan