Pola Singleton
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GDScript di Coddy. Pelajaran 46 dari 65.
Pola Singleton memastikan sebuah class hanya memiliki satu object dan memberi setiap skrip satu cara untuk mengaksesnya. Gunakan pola ini untuk hal-hal yang hanya dimiliki satu oleh game, seperti pengaturan, sistem penyimpanan, dan pencatat skor.
Di GDScript, static var menyimpan satu object, dan static func membuatnya saat pertama kali seseorang memintanya:
# game_settings.gd
class_name GameSettings
extends RefCounted
static var _instance: GameSettings = null
var volume := 50
static func get_instance() -> GameSettings:
if _instance == null:
_instance = GameSettings.new()
print("Creating settings")
return _instance_instance milik class, bukan object, jadi setiap script melihat variabel yang sama. Pemanggilan pertama menemukannya kosong dan membuat object; setiap pemanggilan berikutnya mengembalikan object yang sama.
# main.gd
var a := GameSettings.get_instance()
var b := GameSettings.get_instance()
a.volume = 80
print(b.volume)
print(a == b)Creating settings
80
truea dan b adalah dua variabel yang menyimpan satu object, jadi perubahan yang dibuat melalui a terlihat melalui b. Untuk object, == bernilai true hanya ketika kedua sisi merujuk ke object yang sama.
GDScript tidak bisa membuat _init() bersifat privat, jadi tidak ada yang mencegah skrip memanggil GameSettings.new() dan mendapatkan object kedua. Garis bawah pada _instance dan method get_instance() adalah kesepakatannya: skrip meminta object tersebut, bukan membuatnya sendiri.
Dalam proyek Godot, cara umum untuk mendapatkan satu object bersama adalah dengan autoload: skrip yang kamu daftarkan di Project Settings. Godot membuatnya satu kali saat game dimulai dan membuatnya tersedia berdasarkan nama di setiap skrip. Ini adalah Singleton yang dikelola Godot untukmu. Autoload disiapkan di editor, jadi tantangan di sini membangun pola tersebut dalam kode menggunakan static var.
Tantangan
MudahSetiap koin dalam game menambah satu skor bersama. Jadikan ScoreManager sebagai Singleton:
static varmenyimpan satu-satunya object.static func get_instance()mengembalikannya, dengan membuatnya pada pemanggilan pertama. Tepat setelah membuatnya, fungsi ini mencetakScore manager created.add_points(points)menambahkan poin kescore.
Di coin.gd, collect() menambahkan value koin ke skor melalui ScoreManager.get_instance().
Kode yang disediakan membaca jumlah event yang menyusul, lalu membaca satu event per baris: coin VALUE mengumpulkan koin baru, bonus POINTS menambahkan poin secara langsung. Setelah setiap event, kode mencetak skor, dan di akhir mencetak apakah dua pemanggilan get_instance() mengembalikan object yang sama. Untuk coin 5 dan bonus 20, outputnya adalah:
Score manager created
Score: 5
Score: 25
Same object: trueTulis kodemu di score_manager.gd dan coin.gd. main.gd berisi kode input/output yang disediakan dan tidak dapat diedit.
Coba sendiri
extends Node
func _ready():
# Kode input/output yang disediakan: biarkan tetap seperti ini
var count := int(OS.read_string_from_stdin())
for i in count:
var parts := OS.read_string_from_stdin().split(" ")
if parts[0] == "coin":
Coin.new(int(parts[1])).collect()
elif parts[0] == "bonus":
ScoreManager.get_instance().add_points(int(parts[1]))
print("Score: %d" % ScoreManager.get_instance().score)
print("Same object: %s" % (ScoreManager.get_instance() == ScoreManager.get_instance()))
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalPengantar OOPclass dan objectKata Kunci selfmethodpropertyKonstruktor (_init)Ringkasan: Kalkulator Sederhana4Polimorfisme
Method Overriding Sekali LagiDuck TypingKelas Abstrak dan MethodDesain InterfaceRingkasan: Kalkulator Bentuk7Sinyal
Apa itu Sinyal?Mendeklarasikan dan MemancarkanMenghubungkan ke SinyalSinyal dengan ArgumenRangkuman, Sistem Kesehatan10Pola Desain Bagian 2
Pola CommandPola AdapterPola DecoratorPola Template MethodPola StatePola Composite2Property class
Variabel instance vs. variabel statisFungsi statisSetter propertyGetter propertyPrivat berdasarkan konvensiRangkuman: Pengelola Rekening Bank5Enkapsulasi
Member Publik dan PrivatValidasi dengan SetterPenyembunyian InformasiProperty Hanya-BacaRingkasan: Sistem Catatan Siswa8Konsep OOP Lanjutan
Komposisi vs PewarisanInner ClassNode sebagai KomponenRefCounted vs NodeEnum dalam Class11Proyek: Manajemen Perpustakaan
Gambaran Umum Proyekclass Buku dan PenggunaLatihan sendiri: Compiler GDScript online