Le pattern Factory Method en Swift

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.

1 Etoile2 Etoiles3 Etoiles4 Etoiles5 Etoiles (3 votes, average: 5,00 out of 5)
Loading...

Aucun commentaire

Time limit is exhausted. Please reload CAPTCHA.

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.