30

Có vẻ như đây là câu hỏi là một bản dupe, nhưng hãy chịu với tôi - Tôi hứa tôi đã đọc các bài viết liên quan (và GOF book).Tóm tắt Nhà máy, Nhà máy Phương pháp, Builder

Sau tất cả mọi thứ tôi đã đọc, tôi vẫn không rõ khi sử dụng Nhà máy trừu tượng, Phương thức nhà máy hoặc Trình tạo. Tôi tin rằng nó cuối cùng sẽ chìm vào sau khi tôi thấy một ví dụ đơn giản về vấn đề được tiếp cận tốt nhất bằng cách, một người xây dựng và sẽ rõ ràng là ngớ ngẩn khi sử dụng, ví dụ: nhà máy trừu tượng.

Bạn có thể cung cấp ví dụ đơn giản nơi bạn sẽ sử dụng rõ ràng một mẫu chứ không phải mẫu khác không?

Tôi hiểu rằng nó có thể đun sôi xuống theo ý kiến ​​nếu ví dụ quá đơn giản, nhưng tôi hy vọng rằng nếu có thể, người đó ở trong SO.

Cảm ơn.

Trả lời

50

Trình xây dựng giúp bạn xây dựng một đối tượng phức tạp. Ví dụ là lớp StringBuilder (Java, C#), tạo chuỗi đoạn cuối cùng theo từng phần. Một ví dụ tốt hơn là UriComponentsBuilder trong Spring, giúp bạn xây dựng một URI.

Phương pháp nhà máy cung cấp cho bạn một đối tượng hoàn chỉnh trong một lần chụp (chứ không phải đối với trình tạo). Một lớp cơ sở định nghĩa một phương thức trừu tượng đơn lẻ trả về một tham chiếu giao diện (hoặc siêu lớp) và ngăn cản việc tạo đối tượng cụ thể của đối tượng tới các lớp con.

Nhà máy trừu tượng là giao diện (hoặc lớp trừu tượng) để tạo nhiều đối tượng liên quan khác nhau. Một ví dụ điển hình (trong .NET) là lớp DbProviderFactory, phục vụ để tạo các đối tượng liên quan (kết nối, lệnh, ...) cho một nhà cung cấp cơ sở dữ liệu cụ thể (oracle, sql server, ...), tùy thuộc vào việc thực thi cụ thể của nó.

+0

StringBuilder không phải là một việc thực hiện mô hình xây dựng. Đó là một huyền thoại. – NileshChauhan

+1

@NileshChauhan: Tôi cầu xin sự khác biệt! –

+0

'WebRequest.Create' không phải là Phương thức của Nhà máy GoF. Nó là một phương pháp nhà máy tĩnh. Chúng là hai kiểu khác nhau. – jaco0646

0

Mẫu Nhà máy Tóm tắt sử dụng phân lớp (của các nhà máy) để sản xuất các đối tượng khác (không phải nhà máy). Abstract Factory cũng hình dung rằng các đối tượng được sản xuất thuộc về các hệ thống phân cấp song song (ví dụ: để xử lý độc lập nền tảng, một phân cấp cho mỗi nền tảng).

Mẫu Trình tạo sử dụng phân lớp để tạo "đầu ra" - là không nhất thiết là đối tượng ở tất cả. Ví dụ GOF có đầu ra văn bản sản xuất Builder (đánh dấu hoặc bằng cách khác).

Mẫu Phương thức nhà máy, không giống như hai phương pháp khác, chia "người tạo" thành triển khai trừu tượng và cụ thể (do đó nhấn mạnh vào nó thuộc về triển khai khung). Giống như Abstract Factory, nó đề cập đến việc tạo ra các đối tượng thực tế.

Tất cả ba đều rất giống nhau, vì tất cả đều sử dụng phân lớp phụ. Đó là phân lớp đó là chất lượng vượt trội của tất cả chúng, che giấu sự khác biệt tinh tế (được nêu ở trên) và do đó nhiều người gặp khó khăn khi thấy sự khác biệt.

0

Nhà máy trừu tượng đặc biệt hữu ích cho việc phát triển thử nghiệm và giảm khớp nối.

Ví dụ, trong C#:

public class Worker 
{ 
    public IConsumerFactory Factory { get; set; } 

    private IResource resource; 

    public DoWork() 
    { 
     IConsumer consumer = Factory.CreateConsumer(); 
     consumer.Consume(resource); 
    } 
} 

public interface IConsumerFactory 
{ 
    IConsumer CreateConsumer(); 
} 

public interface IConsumer 
{ 
    void Consume(IResource resource); 
} 

public class DefaultConsumerFactory : IConsumerFactory 
{ 
    public IConsumer CreateConsumer() 
    { 
     return new DefaultConsumer(); 
    } 
} 

public class DefaultConsumer : IConsumer 
{ 
    public void Consume(IResource resource) 
    { 
     ... Do Work ... 
    } 
} 

Bằng cách này, bạn có thể sử dụng dependency injection để tiêm triển khai mặc định cho mã sản xuất, và sau đó bạn có thể dễ dàng thử nhà máy và các đối tượng nó tạo ra.

8

Builder

// Builder encapsulates construction of other object. Building of the object can be done in multiple steps (methods) 
public class ConfigurationBuilder 
{ 
    // Each method adds some configuration part to internally created Configuration object 
    void AddDbConfiguration(...); 
    void AddSmtpConfiguration(...); 
    void AddWebServicesConfiguration(...); 
    void AddWebServerConfiguration(...); 

    // Returns built configuration 
    Configuration GetConfiguration(); 
} 

phương pháp Factory

// Factory method is declared in base class or interface. Subclass defines what type is created by factory method. 
public interface ICacheProvider 
{ 
    ISession CreateCache(); // Don't have to return new instance each time - such decission is part of implementation in derived class. 
} 

public class InMemoryCacheProvider : ICacheProvider 
{ ... } 

public class DbStoredCacheProvider : ICacheProvider 
{ ... } 

// Client code 
ICacheProvider provider = new InMemoryCacheProvider 
ICache cache = provider.CreateCache(); 

Abstract Factory

// Abstract factory defines families of platform classes - you don't need to specify each platform class on the client. 
public interface IDbPlatform 
{ 
    // It basically defines many factory methods for related classes 
    IDbConnection CreateConnection(); 
    IDbCommand CreateCommand(); 
    ... 
} 

// Abstract factory implementation - single class defines whole platform 
public class OraclePlatfrom : IDbPlatform 
{ ... } 

public class MySqlPlatform : IDbPlatform 
{ ... } 

// Client code: 
IDbPlatform platform = new OraclePlatform(); 
IConnection connection = platform.CreateConnection(); // Automatically Oracle related 
... 
0
  • Mẫu phương thức của nhà máy - Khi bạn muốn xây dựng họ các đối tượng phức tạp.
  • builder Object pattern - Khi bạn muốn cho phép người dùng cắm thực hiện tùy chỉnh của họ vào khuôn khổ của bạn

Vui lòng truy cập địa chỉ sau để biết thêm chi tiết.

http://xeon2k.wordpress.com

1

tôi đã viết một bài báo ngày khác với một mục tiêu để so sánh các mô hình Nhà máy Phương pháp và mô hình Builder. Bạn có thể tìm thấy ở đây: http://www.shenghua.co.uk/factory-method-vs-builder/. Hy vọng nó có thể cung cấp một số giúp quá.

Từ kinh nghiệm của riêng tôi, tôi đã tìm thấy cuốn sách Mẫu thiết kế đầu tiên cũng là một cuốn sách thực sự hay nói về các mẫu thiết kế. Khác với cái được viết bởi Erich Gamma, nó tiếp cận mọi mẫu thiết kế bằng cách giới thiệu một vấn đề gây ra bởi khi các mẫu thiết kế không được sử dụng và sau đó bước lên làm thế nào một mẫu thiết kế có thể giải quyết vấn đề đó. Đó là một bài đọc rất thú vị đối với tôi. Nó cũng làm cho một văn bản của Erich Gamma dễ hiểu hơn nhiều sau khi đọc xong.

2

Abstract Factory, Nhà máy Method, Builder: Tất cả các mô hình là mẫu creational, đó là các mẫu thiết kế mà đối phó với cơ chế tạo ra đối tượng, cố gắng để tạo các đối tượng một cách phù hợp với tình hình. phương pháp

Factory:

  1. Nó định nghĩa một giao diện để tạo một đối tượng, nhưng hãy để lớp con quyết định lớp để nhanh chóng
  2. Chúng tôi tạo ra một đối tượng mà không lộ logic tạo cho khách hàng và tham chiếu đến đối tượng mới tạo bằng giao diện chung (hoặc lớp trừu tượng)
  3. Cung cấp khớp nối lỏng lẻo bằng cách loại bỏ nhu cầu để ràng buộc các lớp ứng dụng cụ thể vào mã.Mã tương tác chỉ với giao diện hoặc lớp trừu tượng
  4. Nó có thể sử dụng thừa kế hoặc phụ classing để đạt được mục đích

    lưu ý quan trọng: Bạn sẽ tạo ra một giao diện thực hiện & cụ thể của các giao diện. Trong phương thức Factory, tùy thuộc vào điều kiện, bạn sẽ nhận được thực thi cụ thể về giao diện chung.

Abstract Factory:

  1. Cung cấp một giao diện để tạo gia đình có liên quan hoặc người phụ thuộc đối tượng mà không chỉ định các lớp học của họ bê tông
  2. Một hệ thống cấp bậc mà đóng gói: nhiều càng tốt "nền tảng "` và việc xây dựng một bộ "sản phẩm"
  3. lớp Abstract Factory thường được thực hiện với phương pháp Factory, nhưng họ cũng có thể được thực hiện sử dụng Prototype

Builder:

  1. Builder pattern xây dựng một đối tượng phức tạp sử dụng đối tượng đơn giản và sử dụng một bước theo cách tiếp cận từng bước
  2. Thay thế cho phương thức Nhà máy/Nhà máy trừu tượng trong trường hợp này: Quá nhiều đối số để chuyển từ chương trình khách hàng sang lớp nhà máy đó có thể là lỗi dễ bị
  3. Một số các thông số có thể tùy chọn không giống như trong nhà máy mà lực lượng để gửi tất cả các thông số

Hướng dẫn cho mẫu thiết kế Builder trong Java

  1. Thực hiện một tĩnh lớp lồng nhau được gọi là Builder bên trong lớp có đối tượng sẽ được tạo bởi lớp Builder
  2. Lớp Builder sẽ có cùng một tập hợp các trường làm lớp gốc
  3. Lớp trình tạo sẽ hiển thị phương pháp để thêm thành phần. Mỗi phương thức sẽ trả về cùng một đối tượng Builder. Builder sẽ được làm giàu với mỗi cuộc gọi phương thức.
  4. Builder.build() phương pháp sẽ sao chép tất cả các giá trị lĩnh vực xây dựng vào lớp học thực tế và trở về đối tượng của Lớp Item
  5. mục lớp (class mà chúng ta đang tạo Builder) nên có xây dựng tư nhân để tạo ra đối tượng của nó từ phương thức build() và ngăn người ngoài truy cập vào hàm tạo của nó.

bài viết liên quan:

Design Patterns: Factory vs Factory method vs Abstract Factory

Keeping builder in separate class (fluent interface)

Liên kết hữu ích:

sourcemaking thiết kế mẫu

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