cuốn sách gpt4 ai đã làm

Học mẫu thiết kế (2) Mẫu nhà máy - Mẫu phương thức nhà máy + Sổ đăng ký

In lại Tác giả: Sahara Thời gian cập nhật: 2024-06-03 19:03:25 59 4
mua khóa gpt4 Nike

Mục lục
  • Nhược điểm của Factory Method Pattern
  • Đăng ký

Nhược điểm của Factory Method Pattern

Trong lưu ý trước, chúng tôi đã giới thiệu mẫu phương thức xuất xưởng. Sơ đồ lớp của ví dụ như sau:

Hãy xem xét một tình huống: Bây giờ bạn cần khởi tạo động các đối tượng dựa trên tài nguyên bên ngoài trong khi chương trình đang chạy. Điều đó có nghĩa là chúng ta không thể biết loại đối tượng sẽ được khởi tạo tại thời điểm biên dịch. Vì vậy, cần phải đưa ra phán quyết trong quá trình khởi tạo.

Ví dụ: trong ví dụ của tôi, để khởi tạo một đối tượng camera dựa trên một camera được kết nối với máy chủ, thì khi máy khách (bên sử dụng phương thức gốc để tạo phiên bản) sử dụng mẫu phương thức gốc để tạo đối tượng, mã có thể trông như thế này:

// Kích thước mảng được xác định trong thời gian chạy và không thể thay đổi sau khi xác định auto camera_devices_ = std::make_unique<>[]>(online_camera_num_); for(int i = 0; i < onlined_Camera_num_; ++ i) nhà máy { std::shared_ptr; camera_name[i]) //Phần tử trong camera_name[i] là tên nhà cung cấp tương ứng với camera được kết nối thu được trước Factory = std::make_shared(); ) nhà máy = std::make_shared(); else if("Huaray" == camera_name[i]) nhà máy = std::make_shared(); camera_devices_[i] = Factory->CreateCamera();

Mặc dù mẫu phương thức nhà máy tuân theo nguyên tắc mở và đóng, tức là khi có loại mới, không cần sửa đổi mã hiện có, chỉ cần thêm một lớp sản phẩm mới và lớp nhà máy tương ứng. Nhưng đối với máy khách, khi số lượng loại cần khởi tạo tăng lên, nếu cần phải thêm một loại mới để thích ứng, điều này khiến mã máy khách trở nên dài dòng và khó bảo trì.

Đăng ký

Để giải quyết vấn đề trên, chúng ta có thể triển khai một sổ đăng ký kiểu để cho phép tạo các đối tượng động. Cách tiếp cận này cho phép khởi tạo các đối tượng một cách linh hoạt dựa trên tên chuỗi bằng cách ánh xạ các từ khóa tới các con trỏ hàm tạo.

#ifndef Reflection_H #define Reflection_H #include  #bao gồm  template  void* CreateInstance(ArgType... args) { return new T(args... } / /Các lớp yêu cầu phản ánh được đăng ký bằng macro này #ifndef ReflectRegister #define ReflectRegister(identifier, class_name, ...) \ static bool __type##class_name = Object::Register(identifier, (void*)CreateInstance); #endif class Object { public: template  static BaseClass *CreateObject(const std::string &vendor_name , ArgType... args) { sử dụng CreateFactory = BaseClass *(*)(ArgType...); GetStaticFuncMap(); auto iter = class_map.find(vendor_name); if (iter == class_map.end()) { CRRC_ERROR("class_name không tìm thấy trên bản đồ"); "); return reinterpret_cast(class_map[vendor_name])(args...); } } //Đăng ký từ khóa và hàm tạo lớp để ánh xạ bool tĩnh Register(const std::string &vendor_name, void *ctor_ptr) { CRRC_DEBUG("Đăng ký class_name:"<& GetStaticFuncMap() { static std::map return class_map_; #endif //Reflection_H

Trong một nhà máy sản xuất máy ảnh cụ thể, chúng ta có thể sử dụng ReflectRegister để đăng ký lớp này (lấy máy ảnh Basler làm ví dụ, các loại còn lại tương tự):

lớp BaslerCameraDeviceFactory : public CameraDeviceFactory { public: std::shared_ptr CreateCameraDevice() ghi đè { return std::make_shared() } };

Được rồi, bây giờ nhìn lại mã của khách hàng để tạo đối tượng bằng cách sử dụng mẫu phương thức xuất xưởng, nó có thể được đơn giản hóa thành:

// Kích thước mảng được xác định trong thời gian chạy và không thể thay đổi sau khi xác định auto camera_devices_ = std::make_unique<>[]>(online_camera_num_); for(int i = 0; i < onlined_Camera_num_; ++ i) { auto p_factory = Object::CreateObject(Camera_name[i]);//Phần tử trong camera_name[i] là tên nhà cung cấp tương ứng với camera được kết nối thu được trước nếu (!p_factory) tiếp tục; >CreateCameraDevice(); xóa p_factory }

Cuối cùng, bài viết này về Design Pattern Learning (2) Factory Pattern - Factory Method Pattern + Đăng ký kết thúc tại đây Nếu bạn muốn biết thêm về Design Pattern Learning (2) Factory Pattern - Factory Method Pattern + Đăng ký nội dung của bảng. , vui lòng tìm kiếm các bài viết của CFSDN hoặc tiếp tục duyệt các bài viết liên quan. Tôi hy vọng bạn sẽ ủng hộ blog của tôi trong tương lai! .

59 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress