2011-01-28 17 views
5

trong C# bạn phải khai báo tất cả mọi thứ trong một lớp học nên một hình ví dụ nhà máy có thể trông giống như:mô hình nhà máy thích hợp trong C++

namespace MySpace { 

public class CFactory 
{ 
    public static CFactory Current() 
    { 
    static CFactory singleton; 
    return singleton; 
    } 
    public CBase Create() { return null; } 
} 

} 

trong C++ bạn không có hạn chế này .. Vì vậy, nó được coi là "thực tế xấu "để có" nhà máy "phương pháp được toàn cầu chức năng vs có họ là một lớp học?

dụ 1:

namespace MySpace { 

// factory method 
std::shared_ptr<CBase> CreateBase() { return NULL; } 

} 

dụ 2:

namespace MySpace { 

// factory class 
class CFactory 
{ 
public: 
    std::shared_ptr<CBase> CreateBase() { return NULL; } 
}; 

// factory method exposing class 
CFactory& GetFactory() 
{ 
    static CFactory singleton; 
    return singleton; 
} 

} 

dụ 3:

namespace MySpace { 

// factory class with no global function 
class CFactory 
{ 
public: 
    std::shared_ptr<CBase> CreateBase() { return NULL; } 

public: 
    static CFactory& getFactory() 
    { 
    static CFactory singleton; 
    return singleton; 
    } 
}; 

} 

thư viện std sử dụng rất nhiều các chức năng toàn cầu cho "phương pháp nhà máy" .. một ví dụ về điều này sẽ là std :: make_shared.

Tôi đã sử dụng cả trước và tôi chỉ không chắc chắn nếu một được coi là "tốt hơn" trong khác

+0

Tôi có xu hướng đặt một 'static Foo * make()' hoặc tương tự bên trong lớp cơ sở 'Foo'.Tôi thực sự không hiểu những gì đang xảy ra với singleton trong ví dụ thứ hai của bạn ... –

+0

Tôi đã thêm ví dụ 3 để loại bỏ chức năng toàn cầu cho singleton. trọng tâm của tôi là nhiều hơn về mô hình nhà máy, nhưng những người khác đã bị nhầm lẫn bởi ví dụ 2 là tốt. – BabelFish

Trả lời

3

Bạn có thể đoán từ việc sử dụng của nó trong thư viện tiêu chuẩn mà một nhà máy toàn cầu namespaced không phải là ngầm sai. Không có gì ngăn nó không chính xác.

Cách tiếp cận gói nhà máy của bạn trong một lớp học là tổ chức thay đổi. Bản thân tổ chức cũng không tốt hay xấu. Nó có thể được thực hiện tốt hoặc kém.

Bạn nên làm bất cứ cách tiếp cận nào cảm thấy thoải mái cho ngữ cảnh của nó. Tôi cũng đã thấy cả hai cách tiếp cận được sử dụng nhiều lần và không phải là vấn đề đặc biệt.

0

Dưới đây là một ví dụ về một cách để thực hiện singleton trong C++
Bằng cách này bạn có thể tránh được toàn cầu.
Hy vọng điều này sẽ hữu ích.

/* header file */ 

#ifndef EXAMPLE_H 
#define EXAMPLE_H 

class example 
{ 
private: 
    example(); // constructor 
public: 
    ~example(); // destructor 
    static example *getExampleObject(); 
} 
#endif 

/* cpp file */ 
#include "example.h" 

example *example::getExampleObject() 
{ 
    static example *theInstance = NULL; 
    if(theInstance == NULL) 
    { 
     theInstance = new example(); 
    } 
    return theInstance; 
} 
+0

có chức năng toàn cục không bắt buộc trong ví dụ thứ hai. tập trung của tôi là nhiều hơn về mô hình nhà máy và không phải là mô hình singleton :) – BabelFish

+0

Vâng, sau khi đọc op của bạn một lần nữa, tôi nhận ra rằng bạn đã nói về nhà máy thay thế. lỗi của tôi. Có lẽ ai đó sẽ tìm thấy nó hữu ích mặc dù. = P – prolink007

+1

Tôi thích: 'example & example :: getExampleObject() {static example theInstance; return theInstance; } 'Bằng cách đó bạn sẽ không phải lo lắng về con trỏ null – Marlon

0

Chức năng miễn phí là tốt trong C++ và tôi sẽ đi với tuyến đường đó.

Hơi không liên quan: tại sao bạn trả lại con trỏ thông minh được chia sẻ từ nhà máy? Quyền sở hữu đối tượng mới được tạo có luôn được chia sẻ không?

+0

trong mã thực sự, có nó được chia sẻ. :) xin lỗi vì sự nhầm lẫn – BabelFish

1

Tôi vẫn khuyên bạn nên đặt các chức năng vào một lớp (và thậm chí làm cho chúng ảo). Nó rất tốt đẹp để có thể thay thế nhà máy của bạn vì bất kỳ lý do nào, và làm những việc theo cách đó sẽ làm cho việc này trở nên dễ dàng hơn nhiều. Trong thư viện chuẩn, chức năng của nhà máy chủ yếu tồn tại vì mở rộng khuôn mẫu chức năng có thể dựa trên các kiểu đối số, nhưng cho đến khi C++ 17 bạn không thể có các lớp mẫu tạo ra các cá thể của lớp dựa trên các kiểu ăn cho nhà xây dựng. Vì vậy, các chức năng của nhà máy đó được cho là đúng hơn với tư cách là các nhà thầu không phải thành viên hơn là một nhà máy. Chúng luôn luôn trả về một thể hiện của một kiểu cụ thể.

Trong nhà máy 'đúng', nhà máy có thể trả về bất kỳ loại nào triển khai giao diện được chỉ định hoặc bắt nguồn từ loại được chỉ định. Các nhà máy đúng luôn trả về các con trỏ hoặc tham chiếu (trong các trường hợp hiếm hoi), nhưng không phải là các cá thể thực tế.

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