Sự khác biệt giữa mô hình nhà máy và nhà máy trừu tượng là gì?


40

Cuối cùng đã bắt đầu nghiêm túc cố gắng học một số mô hình cơ bản (rất muộn trong sự nghiệp, nhưng đó là một câu chuyện khác), tôi đang cố gắng tìm hiểu về sự khác biệt giữa Mô hình nhà máy và Nhà máy trừu tượng.

Sự khác biệt chính giữa hai mẫu này là gì?

Tôi hiểu rằng Phương thức Factory tạo ra các đối tượng thông qua tính kế thừa và Tóm tắt Factory thực hiện nó thông qua thành phần đối tượng, nhưng từ quan điểm thực tế, tôi vẫn gặp khó khăn khi hình dung chính xác cách chúng hoạt động.



2
Để làm rõ, bạn có nghĩa là "Phương pháp nhà máy" khi bạn nói "Mô hình nhà máy"? Nếu bạn đang nói về mô hình Gang of Four, không có Mô hình nhà máy, nhưng có Phương thức nhà máy và nhà máy trừu tượng.
Thomas Owens

Có - Phương pháp nhà máy.
Phil.Wheeler

3
Công bằng mà nói, hai cụm từ dường như khá phổ biến lẫn nhau.
Phil.Wheeler

1
Ah, Phương pháp nhà máy. Một cách giải quyết cho thực tế đó newkhông phải là một phương thức (trong một số - hệ thống đối tượng được thừa nhận phổ biến).
Donal Fellows

Câu trả lời:


44

Các Phương pháp Factory thường được phân loại theo một tuyên bố chuyển đổi trong đó mỗi trường hợp trả về một lớp học khác nhau, sử dụng giao diện gốc tương tự để mã gọi không bao giờ cần phải đưa ra quyết định về việc thực hiện.

Hãy nghĩ về một nhà máy xác nhận thẻ tín dụng trả về một trình xác nhận khác nhau cho từng loại thẻ.

public ICardValidator GetCardValidator (string cardType)
{
    switch (cardType.ToLower())
    {
        case "visa":
            return new VisaCardValidator();
        case "mastercard":
        case "ecmc":
            return new MastercardValidator();
        default:
            throw new CreditCardTypeException("Do not recognise this type");
    }
}

Các Abstract Factory là nơi bạn có nhiều lớp nhà máy bê tông (không Factory phương pháp) có nguồn gốc từ một giao diện mà có thể trở lại nhiều loại khác nhau từ phương pháp khác nhau.

Hãy nghĩ về một người quản lý trò chơi cờ vua với một lớp khác nhau cho mỗi bộ quy tắc biến thể.

public class StandardChessRulesFactory : IChessRulesFactory
{
    public IBoardMapper GetBoardMapper()
    {
        return new StandardChessBoardMapper();
    }

    public IKingMover GetKingMover()
    {
        return new StandardChessKingMover();
    }

    public IMoveClock GetMoveClock()
    {
        return new StandardMoveClock();
    }
}

public class HexagonalChessRulesFactory : IChessRulesFactory
{
    public IBoardMapper GetBoardMapper()
    {
        return new HexagonalChessBoardMapper();
    }

    public IKingMover GetKingMover()
    {
        return new HexagonalChessKingMover();
    }

    public IMoveClock GetMoveClock()
    {
        return new StandardMoveClock();
    }
}

public class SpeedChessRulesFactory : IChessRulesFactory
{
    public IBoardMapper GetBoardMapper()
    {
        return new StandardChessBoardMapper();
    }

    public IKingMover GetKingMover()
    {
        return new StandardChessKingMover();
    }

    public IMoveClock GetMoveClock()
    {
        return new SpeedChessMoveClock();
    }
}

Một Nhà máy Trừu tượng, giống như Chiến lược, thường được chọn bằng Phương thức Nhà máy, nhưng không nhất thiết phải kết hợp chúng để nó là mô hình của chính nó.


3
Là giải thích về phương pháp Factory đúng? Điều gì về "Mẫu phương thức nhà máy dựa vào sự kế thừa, vì việc tạo đối tượng được ủy quyền cho các lớp con thực hiện phương thức nhà máy để tạo đối tượng". Vì vậy, ví dụ giống như tĩnh Factory.
SerG

@SerG Vâng, công bằng mà nói, bạn đã chọn trích dẫn đó từ Wikipedia, trên một trang đọc rất khác ba năm trước. Tôi sẽ lập luận rằng trang Wikipedia hiện tại mâu thuẫn ở một số nơi, nhưng tôi không muốn tham gia vào việc chọn ra điều đó. Điều mà tôi sẽ thừa nhận, nhìn nhận lại, đó là ví dụ tôi đã cung cấp ở đây là một loại Phương thức Nhà máy cụ thể, được gọi là Phương pháp Nhà máy Tham số. Nhưng quan điểm về sự khác biệt giữa Phương thức nhà máy và Nhà máy trừu tượng nắm giữ tất cả các loại Phương thức nhà máy.
pdr

2
Tuyên bố tương tự như trích dẫn của tôi tồn tại trong "Mẫu thiết kế" của GoF. Và FM tham số cũng được mô tả ở đó.
SerG

Phần quan trọng là nhà máy sẽ cung cấp cho người gọi một đối tượng phù hợp, tùy thuộc vào tình huống cụ thể và người gọi không cần biết chính xác lớp của đối tượng đó là gì và không cần biết đối tượng cụ thể như thế nào đã được chọn, miễn là đối tượng hỗ trợ giao diện mà người gọi biết.
gnasher729

Bạn nên nói rõ trong câu trả lời của bạn rằng ví dụ của bạn không phải là một mẫu phương thức nhà máy điển hình, mà là một số chuyên môn có tên là phương thức nhà máy được tham số hóa. Và viết về định nghĩa của phương pháp nhà máy điển hình, bởi vì nó đang bị sai lệch ngay bây giờ. Tôi chỉ đang tìm hiểu về mẫu phương thức nhà máy, tôi hiểu tất cả mọi thứ và sau đó tôi đọc câu trả lời đó cho thấy mẫu phương thức nhà máy là một cái gì đó khác biệt và tôi đã bối rối. Không có thông tin về ví dụ đó không phải là mẫu phương thức nhà máy điển hình. Cảm ơn SerG đã sẵn sàng trong phần bình luận.
ctomek
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.