Kiến trúc: Mẫu Service Locator

Tags:
Architecture
Design Pattern
Singleton
DI

C# Code

using UnityEngine;
using System.Collections.Generic;

// 1. Service Locator: Một class static để đăng ký và lấy các services
public static class ServiceLocator
{
    private static readonly Dictionary<System.Type, object> services = new Dictionary<System.Type, object>();

    public static void Register<T>(T service) where T : class
    {
        var type = typeof(T);
        if (services.ContainsKey(type))
        {
            Debug.LogWarning($"Service of type {type} is already registered.");
            return;
        }
        services[type] = service;
        Debug.Log($"Service registered: {type.Name}");
    }

    public static T Get<T>() where T : class
    {
        var type = typeof(T);
        if (!services.TryGetValue(type, out var service))
        {
            Debug.LogError($"Service of type {type} not found.");
            return null;
        }
        return (T)service;
    }
    
    public static void Unregister<T>() where T : class {
        services.Remove(typeof(T));
    }
}

// 2. Một interface cho service (ví dụ: IAudioManager)
public interface IAudioManager {
    void PlaySound(string soundName);
}

// 3. Class triển khai service
public class AudioManager : MonoBehaviour, IAudioManager
{
    void Awake()
    {
        // Đăng ký chính nó vào Service Locator
        ServiceLocator.Register<IAudioManager>(this);
    }

    void OnDestroy() {
        ServiceLocator.Unregister<IAudioManager>();
    }

    public void PlaySound(string soundName) {
        Debug.Log("Playing sound: " + soundName);
    }
}

// 4. Một class khác sử dụng service
public class Player : MonoBehaviour
{
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            // Lấy AudioManager từ Service Locator và sử dụng
            IAudioManager audioManager = ServiceLocator.Get<IAudioManager>();
            audioManager?.PlaySound("Player_Jump");
        }
    }
}

Triển khai mẫu Service Locator, một cách đơn giản để các phần khác nhau của game có thể truy cập vào các hệ thống toàn cục (services) như AudioManager, GameManager mà không cần tham chiếu trực tiếp.

Bình luận (0)

Bạn cần đăng nhập để có thể bình luận.

Chưa có bình luận nào. Hãy là người đầu tiên!

Bài viết liên quan

Hướng dẫn cài đặt và sử dụng Zenject, một framework Dependency Injection phổ biến cho Unity, để quản lý các phụ thuộc trong dự án một cách hiệu quả.

Architecture
Design Pattern
DI
Zenject
Optimization

Một mẫu Singleton cơ bản trong Unity để đảm bảo chỉ có một thực thể của một lớp tồn tại trong game. Hữu ích cho các hệ thống toàn cục như GameManager, AudioManager.

Design Pattern
Singleton
Architecture

Giới thiệu về Clean Architecture, một triết lý thiết kế phần mềm giúp tách biệt các mối quan tâm thành các lớp riêng biệt (Entities, Use Cases, Adapters, Frameworks), tạo ra một hệ thống độc lập, dễ kiểm thử và bảo trì.

Architecture
Design Pattern
DI
Optimization

Giới thiệu về mẫu thiết kế Dependency Injection (DI) và tại sao nó giúp code của bạn dễ bảo trì, dễ test và giảm sự phụ thuộc cứng (hard dependencies).

Architecture
Design Pattern
Optimization

Một cấu trúc Finite State Machine (FSM) đơn giản sử dụng enum và switch-case để quản lý các trạng thái khác nhau của AI, như đi tuần, truy đuổi và tấn công.

AI
Architecture
Design Pattern
Gameplay

Áp dụng mẫu MVP để tách biệt logic game (Model), UI (View), và phần điều khiển trung gian (Presenter). Giúp code dễ dàng unit test và quản lý các luồng dữ liệu phức tạp trong UI.

Architecture
Design Pattern
UI
MVP

Sử dụng mẫu Observer với C# events, Actions và UnityEvents để tạo ra các hệ thống giao tiếp với nhau mà không cần biết về sự tồn tại của nhau (decoupling), giúp code linh hoạt và dễ bảo trì.

Architecture
Design Pattern
Event
Optimization

Hiểu rõ về kiến trúc Monolithic - mô hình truyền thống nơi tất cả các thành phần của ứng dụng được xây dựng và triển khai như một đơn vị duy nhất. Đây là kiến trúc mặc định cho hầu hết các game Unity.

Architecture
Design Pattern
Build

Một Singleton để quản lý và phát các hiệu ứng âm thanh (SFX) và nhạc nền (BGM) một cách dễ dàng từ bất kỳ đâu trong game.

Audio
Singleton
Architecture

So sánh các thuật toán sắp xếp như Bubble Sort, Insertion Sort và Quick Sort và khi nào nên sử dụng chúng trong game (ví dụ: sắp xếp bảng xếp hạng).

Algorithm
Architecture
Optimization