Động cơ đã sử dụng nhiều singletons. Nếu ai đó đã sử dụng nó, thì họ nên làm quen với một số trong số họ:
Sự không quen thuộc không phải là lý do tại sao những người độc thân cần phải tránh.
Có nhiều lý do chính đáng tại sao Singleton là cần thiết hoặc không thể tránh khỏi. Các khung trò chơi thường sử dụng các singletons vì đó là hậu quả không thể tránh khỏi khi chỉ có một phần cứng duy nhất. Thật vô nghĩa khi muốn kiểm soát các phần cứng này bằng nhiều phiên bản xử lý tương ứng của chúng. Bề mặt đồ họa là một phần cứng trạng thái bên ngoài và việc vô tình khởi tạo một bản sao thứ hai của hệ thống con đồ họa là không có gì tai hại, vì bây giờ hai hệ thống con đồ họa sẽ chiến đấu với nhau về việc ai sẽ vẽ và khi nào, ghi đè lên nhau không kiểm soát được. Tương tự như vậy với hệ thống xếp hàng sự kiện, họ sẽ chiến đấu về việc ai sẽ nhận được các sự kiện chuột theo kiểu không điều kiện. Khi làm việc với một phần cứng bên ngoài có trạng thái chỉ có một trong số họ, singleton là không thể tránh khỏi để ngăn ngừa xung đột.
Một nơi khác mà Singleton hợp lý là với các trình quản lý Cache. Bộ nhớ cache là một trường hợp đặc biệt. Họ không thực sự được coi là một Singleton, ngay cả khi họ sử dụng tất cả các kỹ thuật tương tự như Singletons để sống và sống mãi mãi. Dịch vụ lưu đệm là dịch vụ trong suốt, chúng không có nghĩa vụ thay đổi hành vi của chương trình, vì vậy nếu bạn thay thế dịch vụ bộ đệm bằng bộ đệm rỗng, chương trình vẫn hoạt động, ngoại trừ việc nó chỉ chạy chậm hơn. Lý do chính tại sao các trình quản lý bộ đệm là ngoại lệ đối với singleton là vì nó không có nghĩa là tắt dịch vụ bộ đệm trước khi tự tắt ứng dụng vì điều đó cũng sẽ loại bỏ các đối tượng được lưu trong bộ nhớ cache, điều này đánh bại điểm có nó như là một đơn lẻ.
Đó là những lý do tốt tại sao các dịch vụ này là singletons. Tuy nhiên, không có lý do chính đáng nào để có singletons áp dụng cho các lớp bạn đã liệt kê.
Bởi vì tôi sẽ cần chúng ở những nơi rất khác nhau trong trò chơi của mình và truy cập được chia sẻ sẽ rất tiện dụng.
Đó không phải là lý do cho singletons. Đó là những lý do cho toàn cầu. Nó cũng là một dấu hiệu của thiết kế kém nếu bạn cần phải vượt qua rất nhiều thứ xung quanh các hệ thống khác nhau. Phải vượt qua mọi thứ xung quanh cho thấy khả năng khớp nối cao có thể được ngăn chặn bằng thiết kế OO tốt.
Chỉ cần nhìn vào danh sách các lớp trong bài đăng của bạn mà bạn nghĩ cần phải là Singletons, tôi có thể nói rằng một nửa trong số họ thực sự không nên là người độc thân và nửa còn lại có vẻ như họ thậm chí không nên ở đó ngay từ đầu. Rằng bạn cần phải vượt qua các đối tượng xung quanh dường như là do thiếu sự đóng gói thích hợp hơn là các trường hợp sử dụng tốt thực sự cho các singletons.
Hãy nhìn vào lớp học của bạn từng chút một:
PlayerData (score, lives, ...)
LevelData (parameters per levels and level packs)
GameData (you may obtain some data from server to configure the game)
Chỉ từ các tên lớp, tôi sẽ nói rằng các lớp này có mùi giống như mô hình phản ứng miền thiếu máu. Các đối tượng thiếu máu thường dẫn đến rất nhiều dữ liệu cần được truyền xung quanh, điều này làm tăng sự ghép đôi và làm cho phần còn lại của mã trở nên cồng kềnh. Ngoài ra, lớp thiếu máu che giấu thực tế rằng bạn có thể vẫn đang suy nghĩ theo thủ tục thay vì sử dụng hướng đối tượng để gói gọn các chi tiết.
IAP (for in purchases)
Ads (for showing ads)
Tại sao các lớp này cần phải là singletons? Đối với tôi, đây có vẻ là những lớp học ngắn, nên được đưa lên khi cần thiết và giải mã khi người dùng kết thúc mua hàng hoặc khi quảng cáo không còn cần phải hiển thị nữa.
EntityComponentSystemManager (mananges entity creation and manipulation)
Nói cách khác, một constructor và một lớp dịch vụ? Tại sao lớp này không có ranh giới rõ ràng cũng không có mục đích ngay cả ở nơi đầu tiên?
PlayerProgress (passed levels, stars)
Tại sao tiến trình của người chơi tách biệt với lớp Người chơi? Lớp Người chơi nên biết cách theo dõi tiến trình của chính mình, nếu bạn muốn triển khai theo dõi tiến trình trong một lớp khác với lớp Người chơi để phân tách trách nhiệm, thì PlayerProTHER phải đứng sau Người chơi.
Box2dManager (manages the physics world)
Tôi thực sự không thể bình luận gì thêm về cái này mà không biết lớp này thực sự làm gì, nhưng có một điều rõ ràng là lớp này được đặt tên kém.
Analytics (for collecting some analytics)
SocialConnection (Facebook and Twitter login, share, friend list, ...)
Đây dường như là các lớp duy nhất mà Singleton có thể hợp lý, bởi vì các đối tượng kết nối xã hội không thực sự là đối tượng của bạn. Các kết nối xã hội chỉ là một cái bóng của các đối tượng bên ngoài sống trong một dịch vụ từ xa. Nói cách khác, đây là một loại bộ đệm. Chỉ cần đảm bảo rằng bạn tách biệt rõ ràng phần bộ nhớ đệm với phần dịch vụ của dịch vụ bên ngoài, vì phần sau không cần phải là một đơn.
Một cách bạn có thể tránh vượt qua các thể hiện của các lớp này là sử dụng chuyển tin nhắn. Thay vì thực hiện cuộc gọi trực tiếp đến các phiên bản của các lớp này, thay vào đó, bạn gửi một tin nhắn được gửi đến dịch vụ Phân tích và Kết nối xã hội một cách không đồng bộ và các dịch vụ này được đăng ký để nhận các tin nhắn này và hành động theo tin nhắn. Vì hàng đợi sự kiện đã là một singleton, bằng cách thực hiện cuộc gọi, bạn sẽ không cần phải vượt qua một trường hợp thực tế khi giao tiếp với một singleton.