Intermédiaire
🧠 Fondamentaux
20 XP
0 personnes ont réussi
Pattern Factory
La Factory (usine) est un pattern qui centralise la création d'objets. Au lieu de créer directement tes objets avec Cercle(5) ou Rectangle(3, 4), tu passes par une usine : FormeFactory.créer('cercle', 5).
L'avantage ? Le code qui utilise la factory n'a pas besoin de connaitre les classes concretes. Si tu ajoutes un Hexagone demain, tu modifies juste la factory, pas tout le code qui crée des formes.
Un dictionnaire de correspondance est plus propre qu'une chaine if/elif :
Implemente un Factory pour créer des formes geometriques : - Cercle(rayon) avec aire() qui calcule pi fois rayon au carre - Rectangle(largeur, hauteur) avec aire() - Triangle(base, hauteur) avec aire() qui calcule base fois hauteur divise par 2 - FormeFactory.créer(type_forme, *args) retourne l'instance correspondante
Si le type est inconnu, leve ValueError.
Exemple : f = FormeFactory.créer('cercle', 3) f.aire() # environ 28.27
Tests (3/4)
Créer cercle
import math
f = FormeFactory.créer('cercle', 3)
assert abs(f.aire() - math.pi * 9) < 0.01
Créer rectangle
f = FormeFactory.créer('rectangle', 4, 5)
assert f.aire() == 20
Créer triangle
f = FormeFactory.créer('triangle', 6, 4)
assert f.aire() == 12
+ 0 tests cachés
Indices (3 disponibles)
Solution officielle
import math
class Cercle:
def __init__(self, rayon):
self.rayon = rayon
def aire(self):
return math.pi * self.rayon ** 2
class Rectangle:
def __init__(self, largeur, hauteur):
self.largeur = largeur
self.hauteur = hauteur
def aire(self):
return self.largeur * self.hauteur
class Triangle:
def __init__(self, base, hauteur):
self.base = base
self.hauteur = hauteur
def aire(self):
return self.base * self.hauteur / 2
class FormeFactory:
_catalogue = {
'cercle': Cercle,
'rectangle': Rectangle,
'triangle': Triangle,
}
@staticmethod
def creer(type_forme, *args):
classe = FormeFactory._catalogue.get(type_forme.lower())
if classe is None:
raise ValueError(f'Type inconnu: {type_forme}')
return classe(*args)