Après nous être intéressé au pattern Builder, nous allons maintenant parler du Factory Method (ou Fabrique en français). Ce patron de conception est très commun car il permet, de manière simple et unique, de créer des objets dérivant d’un même type (généralement abstrait) en fonction de paramètre donné en entrée. Vous avez pas tout compris ? Voici un petit example :
Nous sommes chez Apple dans une usine qui fabrique des ordinateurs et des téléphones. La solution triviale pour créer chacun de ces appareils serait de créer une structure de control if-else
ou switch-case
qui pour un type d’appareil donné nous créer l’objet correspondant avec pour chacun un constructeur spécifique. La pattern Factory Method va faire abstraction du constructeur afin que tous les prdouits se créer de la même manière.
Tout d’abord définissons le protocol Produit
:
protocol Produit: CustomStringConvertible {
var nom: String { get }
var tailleEcran: Double { get }
var prix: Double { get }
}
extension Produit {
var description: String {
return "Je suis \(nom) de \(tailleEcran)\" et je coûte \(prix)"
}
}
Un produit chez Apple se caractérise par un nom, une taille d’écran et un prix. Le Produit
doit se conformer à CustomStringConvertible
pour qu’il puisse afficher les bonnes informations lorsque l’on utilise la méthode print
. Nous avons ajouté une implémentation par défaut de la description du produit.
Maintenant nous allons définir plusieurs produit de chez Apple :
class IPhone: Produit {
let nom: String = "iPhone 6"
let tailleEcran: Double = 4.7
let prix: Double = 799
}
class Macbook: Produit {
let nom: String = "Macbook"
let tailleEcran: Double = 12
let prix: Double = 1449
}
class IMac: Produit {
let nom: String = "iMac"
let tailleEcran: Double = 21.5
let prix: Double = 1249
}
Nous fabriquons 3 produits : un iPhone, un Macbook et un iMac dont voici le listing :
enum ProduitApple {
case IPHONE
case MACBOOK
case IMAC
}
Maintenant reste à construire l’usine qui va avec :
class Usine {
func fabriquer(produit: ProduitApple) -> Produit {
switch produit {
case .IPHONE:
return IPhone()
case .MACBOOK:
return Macbook()
case .IMAC:
return IMac()
}
}
}
Voilà, tout est prêt pour faire tourner l’usine à plein régime ! Et voici comment utiliser notre fabrique flambant neuve :
let usine = Usine()
let iphone = usine.fabriquer(.IPHONE)
print(iphone) // Je suis iPhone 6 de 4.7" et je coûte 799.0
let macbook = usine.fabriquer(.MACBOOK)
print(macbook) // Je suis Macbook de 12.0" et je coûte 1449.0
let imac = usine.fabriquer(.IMAC)
print(imac) // Je suis iMac de 21.5" et je coûte 1249.0
Cette architecture nous permet de rajouter des nouveaux produits très simplement sans impacter l’interface de notre usine.
Pour allez plus loin
Si vous souhaitez en savoir plus sur ce patron de conception vous pouvez jetez un coup d’oeil sur wikipédia.
À bientôt.