Điều này tương tự như một trong những câu hỏi khác của tôi, nhưng đủ khác nhau tôi nghĩ để đảm bảo một câu hỏi mới.Câu hỏi về các nhà máy trừu tượng và tiêm
Về cơ bản tôi đang viết giao diện người dùng và giao diện người dùng của tôi có các nút có thể được chọn. Khi một nút được chọn, giao diện người dùng kết thúc với một lớp cơ sở nút trừu tượng "INode". Từ đây tôi nhận được một nhà máy bằng cách làm node-> getFactory(), và từ đây tôi có thể tạo các hộp thoại hoặc khung nhìn thích hợp cho nút đó vì nhà máy chính xác được trả về bởi nút cụ thể (ví dụ factory-> createAddDialog(), factory- > createView (nút), v.v.).
Câu hỏi của tôi là cố gắng tìm cách tốt nhất để nhà máy đó truy cập vào nút ở địa điểm đầu tiên.
Cho đến nay tôi đã nghĩ đến 3 cách:
1) Tiêm nhà máy đúng khi tôi tạo nút:
AreaNode *node = new AreaNode(new AreaNodeFactory());
Vì vậy, định nghĩa của AreaNode là:
AreaNode : public INode
{
AreaNode(INodeAbstractFactory *injectedFactory)
{
m_injectedFactory = injectedFactory;
}
INodeAbstractFactory* getFactory()
{
return m_injectedFactory;
}
INodeAbstractFactory* m_injectedFactory;
};
2) Tiêm một nhà máy tổng quát hơn và cho phép nút lấy nhà máy từ nhà máy đó:
AreaNode : public INode
{
AreaNode(IFactory *injectedFactory)
{
m_injectedFactory = injectedFactory;
}
INodeAbstractFactory* getFactory()
{
return m_injectedFactory->getAreaNodeFactory();
}
IFactory* m_injectedFactory;
}
3) Chỉ cần tạo các nhà máy bê tông (mặc dù điều này loại bỏ các phạm vi cho việc sử dụng các nhà máy khác nhau cho cùng một nút có lẽ để thử nghiệm hay cho những thay đổi sau):
AreaNode : public INode
{
INodeAbstractFactory* getFactory()
{
return new AreaNodeFactory();
}
}
suy nghĩ hiện nay về các tùy chọn này:
Tùy chọn 1: Có thể là một chút lộn xộn - Tôi phải đảm bảo rằng tôi luôn cung cấp cho nhà máy chính xác loại đó, hoặc có thể tôi chỉ sử dụng một nhà máy khác để bơm đúng nhà máy cho tôi.
Tùy chọn 2: Buộc nút biết về triển khai nhà máy trừu tượng đủ để có thể gọi getAreaNodeFactory, điều này có thể không phải là điều xấu. Nó ít nhất giúp đảm bảo nhà máy chính xác/giống nhau sẽ luôn được tìm nạp (giả sử nhà máy tổng quát hơn được triển khai đúng cách).
Tùy chọn 3: Điều này có chút hạn chế vì tôi sẽ không thể trao đổi lớp học và tôi không quan tâm đến nút phải biết về việc triển khai cụ thể của nhà máy - mặc dù trong trường hợp này có thể không phải là quá nhiều của một vấn đề (từ cuối cùng nổi tiếng!).
Bất kỳ suy nghĩ nào về điều này?
Cảm ơn.
EDIT: Rất tiếc, đã bỏ lỡ các khai báo biến trong bài đăng gốc, đã sửa.
EDIT: Một vấn đề khác với tùy chọn 2 là tôi phải triển khai "getFactory" trong mọi loại nút. Ít nhất với tùy chọn 1, lớp cơ sở chỉ có thể trả lại lớp nhà máy trừu tượng tiêm mỗi lần ..
Tôi thậm chí không chắc chắn các nút nên tham khảo các nhà máy. Giao diện người dùng nên tham khảo một nhà máy trừu tượng, và nó nên sử dụng đa hình để đảm bảo nhà máy bê tông chính xác được sử dụng, tùy thuộc vào loại nút được truyền vào các phương thức tạo. Ngoài ra tôi cho rằng tùy chọn 1 trông ok. Nhưng tôi vẫn tin rằng các nút không nên biết, hoặc giữ một tham chiếu đến bất kỳ nhà máy nào. – Kurt
@Kurt: trong sự vắng mặt của công văn kép, và tránh việc sử dụng một lớp khách truy cập cho mỗi giao diện người dùng "hành động" tôi muốn thực hiện trên nút tùy thuộc vào loại nút, những gì có thể là một giải pháp tốt hơn? Các loại hành động tôi muốn thực hiện trên một nút là dọc theo dòng: createAddDialog (parentWidget), createView (parentWidget), createMiniView (parentWidget), vv Tôi chỉ có thể đặt các phương thức bên trong các lớp nút cụ thể, tức là areaNode -> createView (cha mẹ) - nhưng điều đó không làm được gì nhiều cho việc chia tách. – Mark
Mặc dù tôi đang cố gắng tránh sử dụng hàng loạt mẫu khách truy cập, cách duy nhất tôi có thể thấy để giữ nút hoàn toàn khỏi giao diện người dùng, là sử dụng một khách truy cập để giải quyết lớp nhà máy phù hợp và sau đó tôi có thể tạo các thành phần giao diện người dùng của mình .. – Mark