Tại sao giao diện Nhà cung cấp cần thiết? Chúng tôi không thể dễ dàng đăng ký Dịch vụ - ví dụ:duy trì bản đồ triển khai Dịch vụ và sau đó trả về bản sao khi tra cứu?
Như những người khác đã nêu, mục đích của Nhà cung cấp là có một AbstractFactory có thể tạo ra các trường hợp Service
. Bạn không phải lúc nào cũng muốn giữ tham chiếu đến tất cả các triển khai Dịch vụ vì chúng có thể tồn tại trong thời gian ngắn và/hoặc có thể không sử dụng được sau khi chúng đã được thực thi.
Nhưng mục đích của nhà cung cấp là gì và làm thế nào bạn có thể sử dụng một "đăng ký API cung cấp" nếu bạn không có một nhà cung cấp
Một trong những lý do mạnh mẽ nhất để có một giao diện cung cấp rất bạn KHÔNG cần phải thực hiện tại thời gian biên dịch. Người dùng API của bạn có thể thêm triển khai của riêng họ sau này.
Hãy sử dụng JDBC là một ví dụ như Ajay được sử dụng trong câu trả lời khác nhưng chúng ta hãy cho nó một chút nữa:
Có rất nhiều loại khác nhau của cơ sở dữ liệu và các nhà cung cấp cơ sở dữ liệu người đều có những cách hơi khác nhau trong việc quản lý và thực hiện các cơ sở dữ liệu (và có lẽ cách truy vấn chúng). Những người sáng tạo Java không thể tạo các triển khai của tất cả các cách có thể khác nhau này vì nhiều lý do:
- Khi Java được viết lần đầu, nhiều công ty hoặc hệ thống cơ sở dữ liệu này chưa tồn tại.
- Không phải tất cả các nhà cung cấp cơ sở dữ liệu này đều là nguồn mở nên những người tạo Java không thể biết cách giao tiếp với họ ngay cả khi họ muốn.
- Người dùng có thể muốn viết cơ sở dữ liệu tùy chỉnh riêng của họ
Vậy làm thế nào để bạn giải quyết này? Bằng cách sử dụng Service Provider
.
- Giao diện Driver là
Provider
. Nó cung cấp các phương thức để tương tác với cơ sở dữ liệu của một nhà cung cấp cụ thể. Một trong những phương thức trong Driver
là phương pháp nhà máy để tạo một cá thể Connection
(là Service
) vào cơ sở dữ liệu được cung cấp một url và các thuộc tính khác (như tên người dùng và mật khẩu, v.v.).
Mỗi nhà cung cấp cơ sở dữ liệu tự thực hiện Driver
cách liên lạc với hệ thống cơ sở dữ liệu của riêng họ. Chúng không được bao gồm trong JDK; bạn phải vào trang web của công ty hoặc một số kho lưu trữ mã khác và tải chúng xuống dưới dạng một cái bình riêng biệt.
Để sử dụng các trình điều khiển này, bạn phải thêm bình vào đường dẫn lớp và sau đó sử dụng lớp JDK DriverManager
để đăng ký trình điều khiển.
Lớp DriverManager có phương thức registerDriver(Driver)
được sử dụng để đăng ký phiên bản Trình điều khiển trong Đăng ký dịch vụ để có thể sử dụng. Theo quy ước, hầu hết Driver
triển khai đăng ký vào thời điểm lớp tải vì vậy tất cả bạn phải làm trong mã của bạn là viết
Class.forname("foo.bar.Driver");
Để đăng ký trình điều khiển cho nhà cung cấp "foo.bar"(giả sử bạn có jar với lớp học trong classpath của bạn.)
Khi Drivers Cơ sở dữ liệu đã được đăng ký, bạn có thể nhận được một trường hợp thực hiện dịch vụ được kết nối với cơ sở dữ liệu của bạn.
Ví dụ, nếu bạn đã có một cơ sở dữ liệu mysql trên máy tính địa phương của bạn có tên là "test" và bạn đã có một tài khoản người dùng với tên người dùng "monty" và password "greatsqldb", sau đó bạn có thể tạo một cài đặt dịch vụ như thế này:
Connection conn =
DriverManager.getConnection("jdbc:mysql://localhost/test?" +
"user=monty&password=greatsqldb");
lớp DriverManager thấy Chuỗi bạn đã truyền vào và tìm trình điều khiển đã đăng ký có thể hiểu điều đó có nghĩa là gì. sử dụng Mẫu Chain of Responsibility
bằng cách xem qua tất cả Trình điều khiển đã đăng ký và gọi phương thức Driver.acceptsUrl(Stirng)
của chúng tôi cho đến khi url được chấp nhận)
Lưu ý rằng không có mã cụ thể mysql trong JDK. Tất cả những gì bạn phải làm là đăng ký Trình điều khiển của một số nhà cung cấp và sau đó chuyển một Chuỗi được định dạng đúng cho Nhà cung cấp Dịch vụ. Nếu sau đó chúng ta quyết định sử dụng một nhà cung cấp cơ sở dữ liệu khác (như oracle hoặc sybase) thì chúng ta chỉ cần trao đổi các lọ và sửa đổi chuỗi kết nối của chúng ta. Mã trong DriverManager không thay đổi.
Tại sao chúng ta không tạo kết nối một lần và duy trì nó? Tại sao chúng ta cần Dịch vụ?
Chúng tôi có thể muốn kết nối/ngắt kết nối sau mỗi thao tác. Hoặc chúng tôi có thể muốn giữ kết nối lâu hơn. Việc Dịch vụ cho phép chúng tôi tạo các kết nối mới bất cứ khi nào chúng tôi muốn và không loại trừ chúng tôi khỏi việc tham chiếu đến nó để sử dụng lại sau này.
Đây là một khái niệm rất mạnh mẽ và được sử dụng bởi các khuôn khổ để cho phép nhiều hoán vị và phần mở rộng có thể mà không làm lộn xộn lõi mã.
EDIT
Làm việc với nhiều nhà cung cấp và các nhà cung cấp cung cấp nhiều Services
:
Có gì ngăn cản bạn từ việc có nhiều nhà cung cấp là. Bạn có thể kết nối với nhiều cơ sở dữ liệu được tạo bằng cách sử dụng phần mềm nhà cung cấp cơ sở dữ liệu khác nhau cùng một lúc. Bạn cũng có thể kết nối với nhiều cơ sở dữ liệu được sản xuất bởi cùng một nhà cung cấp cùng một lúc.
Nhiều dịch vụ - Một số Nhà cung cấp thậm chí có thể cung cấp các triển khai Service
khác nhau tùy thuộc vào url kết nối. Ví dụ, H2 có thể tạo cả hai cơ sở dữ liệu dựa trên hệ thống hoặc trong dựa trên memeory cơ sở dữ liệu. Cách để nói với H2 mà một trong những bạn muốn sử dụng là một định dạng url khác nhau. Tôi đã không nhìn vào mã H2, nhưng tôi giả định các tập tin dựa trên và trong bộ nhớ dựa là triển khai dịch vụ khác nhau.
Tại sao DriverManager không quản lý kết nối và Oracle có thể triển khai OracleConnectionWrapper? Không có nhà cung cấp!
Điều đó cũng sẽ yêu cầu bạn biết rằng bạn có kết nối Oracle. Đó là khớp nối rất chặt chẽ và tôi sẽ phải thay đổi rất nhiều mã nếu tôi thay đổi nhà cung cấp.
Service Registration
chỉ cần một chuỗi. Hãy nhớ rằng nó sử dụng chain of Responsiblity
để tìm Nhà cung cấp đã đăng ký đầu tiên biết cách xử lý url. ứng dụng có thể là nhà cung cấp trung lập và nhận được url kết nối và tên lớp Trình điều khiển từ một tệp thuộc tính. Bằng cách đó tôi không phải biên dịch lại mã của mình nếu tôi thay đổi nhà cung cấp.Tuy nhiên, nếu tôi hardcoded refernences để "OracleConnectionWrapper" và sau đó tôi thay đổi các nhà cung cấp, tôi sẽ phải viết lại các phần của mã của tôi và sau đó biên dịch lại.
Không có gì ngăn người khác hỗ trợ nhiều định dạng url của nhà cung cấp cơ sở dữ liệu nếu họ muốn. Vì vậy, tôi có thể làm cho một GenericDriver có thể xử lý mysql và oracle nếu tôi muốn.
Tôi cũng muốn biết mục đích và tiện ích của nhà cung cấp. – danidacar