Trong bài viết này, chúng ta sẽ xem cách sử dụng Factory Design Pattern và giúp bạn có thể tạo các đối tượng khác nhau chỉ bằng cách sử dụng một tập hợp các lớp và phương thức.
Hãy bắt đầu
Tổng quan về mẫu thiết kế
Một mẫu thiết kế là một giải pháp cho một vấn đề chung về thiết kế trong Lập trình hướng đối tượng, nhưng không chỉ xem xét việc phát triển phần mềm, như Christopher Alexander đã nói trong “A Pattern Language” Nhà xuất bản Đại học Oxford, New York 1977
Mỗi mẫu mô tả một vấn đề xảy ra lặp đi lặp lại trong môi trường của chúng ta và sau đó mô tả cốt lõi của giải pháp cho vấn đề
Điều này có nghĩa là các mẫu đó là một tập hợp các giải pháp cho các vấn đề điển hình thường xảy ra khi chúng tôi xây dựng phần mềm của mình, điều này có thể giúp công việc của chúng tôi nhất quán, đáng tin cậy và dễ hiểu hơn
Trong lập trình hướng đối tượng, chúng ta có thể tìm thấy 3 loại Mẫu thiết kế
sáng tạo. để thiết kế việc tạo ra các đối tượng
Cấu trúc. cho mối quan hệ thiết kế giữa các đối tượng
hành vi. cho sự tương tác thiết kế và trách nhiệm của các đối tượng
Trong bài đăng này, chúng ta sẽ thấy Factory Pattern là Mẫu thiết kế sáng tạo, như tên gợi ý và chúng ta sẽ sử dụng nó để đọc các tệp CSV khác nhau, nhưng sử dụng cùng một lớp
Mô hình nhà máy
Factory Pattern là một trong những pattern được sử dụng nhiều nhất
Nó được sử dụng để tạo các loại đối tượng khác nhau chỉ bằng một API và sử dụng các lớp con để xác định đối tượng nào sẽ được tạo
Hãy làm một ví dụ. xem xét việc có hai tệp CSV khác nhau, một tệp chứa thông tin người dùng và một tệp chứa thông tin ô tô, mẫu xuất xưởng sẽ giúp bạn tạo một đối tượng đại diện cho Người dùng và một lớp đại diện cho Ô tô, chỉ sử dụng một “điểm truy cập”
Hãy bắt đầu xây dựng các lớp, mỗi lớp sẽ đại diện cho một hàng CSV
Chúng ta có thể bắt đầu xây dựng một hệ thống phân cấp lớp như thế này
Định nghĩa lớp cho tất cả các loại hàng
Chúng tôi có một lớp Trừu tượng đại diện cho khái niệm về dòng CSV,
Lớp cơ sở hàng CSV
và hai lớp con, một cho người dùng,
Triển khai lớp cụ thể cho hàng Người dùng với phương thức tùy chỉnh in
và một cho xe hơi
Triển khai lớp cụ thể cho hàng Người dùng với phương thức tùy chỉnh in
Không cần sử dụng mẫu xuất xưởng, chúng ta có thể chỉ cần viết điều đầu tiên xuất hiện trong đầu, đó là câu lệnh “nếu” [hoặc chuyển đổi] đơn giản, dựa trên loại thông báo được cung cấp dưới dạng tham số
Một hàm đơn giản hữu ích để xây dựng một đối tượng hàng cụ thể, sử dụng câu lệnh if
Đây còn được gọi là phương pháp xuất xưởng và đây là cách đơn giản nhất để thực hiện và sẽ ổn khi bạn cần làm việc với số lượng loại thấp hơn và với số lượng phụ thuộc thấp, nhưng khi số lượng loại trở nên cao, điều này
Hãy phân tích điều này từ quan điểm kỹ thuật phần mềm
- Nó vi phạm Nguyên tắc Mở/Đóng, vốn nói rằng
Các thực thể phần mềm [các lớp, mô-đun, chức năng, v.v. ] nên được mở để mở rộng nhưng đóng để sửa đổi
Điều này đúng vì nếu bạn muốn thêm một loại dòng CSV khác, chẳng hạn như Vị trí, bạn cần sửa đổi phương thức này. Chúng tôi chỉ đơn giản là buộc phải chỉnh sửa mọi lúc
2. Nó đã vi phạm Nguyên tắc đảo ngược phụ thuộc, nói rằng
Trừu tượng không nên phụ thuộc vào chi tiết. Chi tiết nên phụ thuộc vào trừu tượng
Điều này đúng bởi vì phương thức này phụ thuộc vào việc triển khai lớp chứ không phải lớp trừu tượng. Và nếu chúng ta cần thêm một loại hàng khác, chúng ta thậm chí cần sửa đổi quá trình nhập
Và chúng ta thậm chí có thể thêm cái này. khi trong mã của bạn, bạn tìm thấy danh sách if-else, if-else hoặc switch có nhiều trường hợp, bạn nên xem xét một cách tiếp cận khác
Vì vậy, hãy cố gắng cải thiện logic này bằng cách làm theo hai nguyên tắc sau
Chúng tôi bắt đầu nghĩ về việc khái quát hóa CsvRow bằng cách sử dụng lớp trừu tượng và bây giờ chúng tôi cần nghĩ ra một cách tổng quát để tạo chúng
Một cách để giải quyết vấn đề này là Factory Pattern
UML với lớp nhà máy
Trọng tâm của lớp RowFactory là thuộc tính class_map, đây là một từ điển đơn giản ánh xạ cho mọi loại hàng cụ thể, lớp triển khai nó và như bạn có thể thấy với đường đứt nét từ RowFactory đến CsvRow, nó chỉ phụ thuộc vào
Từ điển này được điền vào hàm tạo của lớp này, bằng cách gọi phương thức create_class_map[]
Hàm này được gọi trên hàm tạo của kết cấu và tìm kiếm tất cả các lớp cụ thể
Hàm này phân tích cú pháp mô-đun thông báo và nó tìm kiếm tất cả các thành phần
- là một lớp học
- không phải là một lớp trừu tượng
- là một lớp con của CsvRow
Theo cách này, các phụ thuộc duy nhất mà lớp này sẽ có là lớp CsvRow trừu tượng
Đây là một ví dụ về nội dung sử dụng công cụ gỡ lỗi trên PyCharm
Khi chúng tôi đã tạo từ điển, chúng tôi đã sẵn sàng để tạo cá thể bằng cách sử dụng phương thức create_row_instance[]
Phương thức này nhận làm tham số loại hàng mà chúng ta muốn xây dựng và nội dung dòng, là tham số của hàm tạo lớp cụ thể
Nó tìm kiếm trên từ điển class_map phần tử có tên được truyền dưới dạng tham số, truy xuất lớp và gọi hàm tạo, truyền nội dung dòng và trả về trực tiếp đối tượng cụ thể
Đây là mã lớp hoàn chỉnh
Triển khai lớp Factory
Và đây là một ví dụ về cách sử dụng lớp nhà máy này để tạo các đối tượng
Ví dụ về việc sử dụng nhà máy trên một tệp chính
Đó là nó
Và bây giờ làm thế nào tôi có thể kiểm tra nó bằng một bài kiểm tra đơn vị?
Chúng ta chỉ có thể sử dụng TestCase. assertIsInstance[] như một xác nhận để xác minh xem nhà máy của chúng ta có hoạt động tốt hay không. Đây là một ví dụ
Ví dụ về Unit Test trên Vải
Trong bộ thử nghiệm này, chúng tôi có ba thử nghiệm, một thử nghiệm cho từng loại hàng và một thử nghiệm để xác minh rằng một ngoại lệ được đưa ra khi một lớp sai được hỏi
Như bạn có thể thấy, trong hai bài kiểm tra đầu tiên, chúng tôi xác minh lớp của đối tượng được tạo bằng TestCase. assertIsInstance[] và cũng sẽ kiểm tra các giá trị của thuộc tính sau khi tạo
Phần kết luận
Mẫu xuất xưởng giúp bạn tạo các loại đối tượng khác nhau có nguồn gốc từ cùng một lớp cha và ngăn việc sửa đổi phần tạo mã của bạn
Bạn viết nó chỉ một lần và gần với một giải pháp tao nhã
Một ưu điểm lớn khác của công cụ này là khi bạn cần mở rộng tính năng của mã như thêm một loại tệp khác, bạn chỉ cần triển khai lớp cụ thể bên trong mô-đun bên phải và nhà máy sẽ lấy nó từ mô-đun đó trong một
liên kếtBạn có thể tìm thấy một triển khai hoàn chỉnh trên liên kết này
https. //chút. ly/3MSkirf
Nếu bạn muốn, bạn có thể thêm tôi trên LinkedIn vào liên kết này
Gabriele Carboni - Kỹ sư phần mềm - OROBIX. LinkedIn
Tôi là Kỹ sư phần mềm có kinh nghiệm thực hành về thử nghiệm tự động, thiết kế kiến trúc, dịch vụ dựa trên đám mây, CI/CD…
www. linkin. com
cảm ơn vì đã dành thời gian cho tôi
Hẹn gặp lại các bạn trong bài viết tiếp theo
Thêm nội dung tại PlainEnglish. io. Đăng ký nhận bản tin hàng tuần miễn phí của chúng tôi. Theo dõi chúng tôi trên Twitter và LinkedIn. Tham gia cộng đồng của chúng tôi