2010-06-03 43 views
5

tại sao chúng ta cần mẫu thiết kế Abstract Factory để tạo đối tượng? Tại sao chúng ta không thể sử dụng toán tử mới? câu trả lời là, để tránh cặp đôi chặt chẽ của các đối tượng. Nhưng tôi không hiểu sao? bất cứ ai có thể giải thích với mã (sẽ rất hữu ích).Mẫu thiết kế nhà máy trừu tượng để tạo đối tượng? Tại sao chúng ta không thể sử dụng toán tử mới?

điều gì làm cho mẫu thiết kế nhà máy trừu tượng trở nên hữu ích và khi nào.

Xin cảm ơn trước. Harsha T

+4

Có rất nhiều giải thích tốt (chẳng hạn như liên kết của Enrico dưới đây) của điều này được tìm thấy với một google hoặc hai tôi thực sự thấy không có giá trị trong tái tạo bất kỳ ở đây. Nếu bạn tìm thấy một lời giải thích có vẻ không thuyết phục, có lẽ một câu hỏi về các chi tiết cụ thể của giải thích đó sẽ thú vị hơn. – djna

Trả lời

2

Nếu bạn sử dụng toán tử new, bạn phải chỉ định loại chính xác mình muốn. Thỉnh thoảng bạn muốn trở nên chung chung hơn, ví dụ vì bạn muốn có thể thay đổi loại được khởi tạo đó trong tất cả mã nguồn nhanh chóng.

2

Một mẫu thiết kế nhà máy trừu tượng được thiết kế để tạo ra một đối tượng với một thiết lập cụ thể vào thời điểm khởi tạo. Ví dụ: nếu bạn có nhiều lớp được kết nối tương tự, thay vì lặp lại cùng 4 dòng [và sử dụng sao chép và dán], nhà máy trừu tượng sẽ cho phép bạn giữ 4 dòng ở một vị trí và giảm số lượng cần thay đổi.

Reference For Abstract Factory

0

Có một khá tốt C# ví dụ về Wikipedia. Nó giữ cho mã cấp ứng dụng của bạn không biết phải triển khai nó. Nhà máy chăm sóc nó.

0

Sử dụng nhà máy trừu tượng, bạn có thể tạo đối tượng mà không cần biết loại thực tế. Giả sử bạn cần một IDictionary. Bạn có thể tạo một thể hiện mới của một lớp cây nhị phân mà bạn tình cờ biết, hoặc bạn có thể nói cho nhà máy IDictionary-factory rằng bạn cần một cá thể mới. Sau đó, một người khác có thể tạo ra một nhà máy thực hiện trả về bảng băm, nhưng mọi thứ ở bên cạnh bạn sẽ vẫn hoạt động theo cùng một cách.

0
  • trước hết bạn không cần phải biết loại cụ thể của đối tượng nhà máy của bạn được instantiating,
  • sau đó bạn có thể cắm các lớp nhà máy của bạn xung quanh dự án của bạn cho họ instantiating đối tượng cho các thành phần của bạn mà không cần phải sử dụng new trong mã của bạn. Nhà máy đã làm công việc bẩn thỉu của nó
  • nó khái niệm tách instantiation của đối tượng từ việc sử dụng của họ, giữ mọi thứ tách riêng
1

Dưới đây là một ví dụ đơn giản có nguồn gốc từ một lớp phiên bản độc lập tôi đã xây dựng cho sản phẩm của chúng tôi:

interface ICadSystemFactory 
{ 
    ICadSystem GetSystemInstance(); 
} 

class 3dCadSystemVersion1 : ICadSystemFactory 
{ 
    ICadSystem GetSystemInstance() 
    { 
     return new 3dCadSystemWrapperVersion1(new 3dCadSystemVersion1()); 
    } 
} 



class 3dCadSystemVersion2 : ICadSystemFactory 
{ 
    ICadSystem GetSystemInstance() 
    { 
     return new 3dCadSystemWrapperVersion2(new 3dCadSystemVersion2()); 
    } 
} 

Đối tượng 3dCadSystemWrapperVersionX triển khai giao diện ICadSystem. Tôi sử dụng một đối tượng Registry để quyết định nhà máy cơ bản nào tôi muốn tạo dựa trên một số định danh phiên bản nhất định. Điều này cho phép tôi cắm các phiên bản mới nếu cần mà không làm xáo trộn cơ sở hạ tầng hiện có, điều này hóa ra hữu ích trong trường hợp này. Nó sẽ, trên thực tế, cho phép tôi để cắm vào các sản phẩm hoàn toàn mới nếu tôi cần, mà nói chung có thể hữu ích, nhưng trong trường hợp của tôi không phải là giá trị nỗ lực thực hiện.

2

Nếu bạn đã:

class Foo implements DoSomething {...} 
class Bar implements DoSomething {...} 

obj = new Foo(); 
obj.doSomething(); 

Mọi nơi trong mã của bạn, một khi bạn muốn thay đổi tất cả các trường của Foo sử dụng trường hợp của Bar, được bạn thực sự sẽ làm tìm kiếm/thay thế?


Nếu bạn có:

obj = DoSomethingFactory.create(); 
obj.doSomething(); 

Bên trong DoSomethingFactory, bạn có thể trả lại bất kỳ đối tượng mà bạn muốn bổ sung giao tiếp DoSomething.

Bằng cách sử dụng một Nhà máy, bạn có quyền kiểm soát tất cả các đối tượng được tạo bởi nó.

Nếu bạn quyết định thay đổi cách Nhà máy tạo đối tượng, thay đổi sẽ có hiệu lực ngay lập tức trong mã sử dụng Nhà máy.

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