Menu
CoddyTech

Patron Factory

Fait partie de la section Programmation orientée objet du Journey GDScript de Coddy. Leçon 47 sur 65.

Le modèle Factory centralise le choix de la classe à créer. Le reste du programme demande à la fabrique « un gobelin » et récupère un objet, sans nommer la classe Goblin.

Les produits partagent une classe parente, donc le code qui les utilise fonctionne avec chacun d’eux :

# enemy.gd
class_name Enemy
extends RefCounted

var hp := 10

func attack() -> String:
	return "The enemy waits"
# goblin.gd
class_name Goblin
extends Enemy

func attack() -> String:
	return "The goblin stabs"
# orc.gd
class_name Orc
extends Enemy

func attack() -> String:
	return "The orc smashes"

La fabrique est une classe dotée d’une static func qui transforme un nom en objet. Son type de retour est la classe parente ; elle peut donc renvoyer n’importe quel type d’ennemi, ou null pour un nom qu’elle ne connaît pas :

# enemy_factory.gd
class_name EnemyFactory
extends RefCounted

static func create(kind: String) -> Enemy:
	match kind:
		"goblin":
			return Goblin.new()
		"orc":
			return Orc.new()
	return null
# main.gd
for kind in ["orc", "goblin", "slime"]:
	var enemy := EnemyFactory.create(kind)
	if enemy == null:
		print("Unknown enemy: ", kind)
	else:
		print(enemy.attack())
The orc smashes
The goblin stabs
Unknown enemy: slime

Des noms comme ceux-ci proviennent généralement de données : une table d’apparition, un fichier de niveau, une commande saisie par le joueur. La fabrique est le seul endroit qui les associe à des classes ; ajouter un Dragon nécessite donc un nouveau fichier et une nouvelle branche dans le match.

Une fabrique peut également configurer l’objet avant de le renvoyer, afin que chaque appelant obtienne un ennemi prêt à l’emploi :

static func create_boss(kind: String, level: int) -> Enemy:
	var boss := create(kind)
	if boss != null:
		boss.hp = 100 * level
	return boss

EnemyFactory.create_boss("orc", 3) renvoie un Orc avec 300 PV.

challenge icon

Défi

Moyen

Une table d’apparition indique les ennemis et leurs niveaux. Enemy (enemy.gd) et sa sous-classe Goblin (goblin.gd) sont écrits ; termine le reste :

  • Dans orc.gd, le constructeur _init(level) transmet le nom Orc, 25 * level PV et 4 + level points de dégâts au constructeur parent, comme le fait Goblin.
  • Dans enemy_factory.gd, static func create(kind, level) renvoie un Goblin pour goblin et un Orc pour orc, créé avec ce niveau. Les majuscules dans le nom n’ont pas d’importance (ORC est un orc). Tout autre nom renvoie null.

Le code fourni lit le nombre d’apparitions à suivre, puis une ligne KIND LEVEL par apparition, et affiche chaque ennemi ou Unknown enemy: KIND, puis le nombre d’ennemis apparus. Pour goblin 2, Orc 3 et slime 1, le résultat est :

Goblin: 20 HP, 4 damage
Orc: 75 HP, 7 damage
Unknown enemy: slime
Spawned: 2

Ton code doit se trouver dans enemy_factory.gd et orc.gd. main.gd contient le code d’entrée/sortie fourni et ne peut pas être modifié.

Essayez vous-même

extends Node

func _ready():
	# Code d'entrée/sortie fourni : laissez-le tel quel
	var spawned := 0
	var count := int(OS.read_string_from_stdin())
	for i in count:
		var parts := OS.read_string_from_stdin().split(" ")
		var enemy := EnemyFactory.create(parts[0], int(parts[1]))
		if enemy == null:
			print("Unknown enemy: ", parts[0])
		else:
			spawned += 1
			print(enemy.describe())
	print("Spawned: ", spawned)
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Programmation orientée objet

Entraînez-vous par vous-même : Compilateur GDScript en ligne