Abstract Factory vs. Factory
La différence entre le design pattern Abstract Factory et Factory est très minime: Factory ne fabrique qu’un type de produit (d’objet) alors qu’Abstract Factory crée des familles de produits, fonctionnellement proches.
Choisir les abstractions
Pour que les abstractions qui sont à la racine de l’arbre représentant la hiérarchie d’héritage demeurent des classes abstraites (simulées, car de telles classes n’existent pas en Ruby), j’y ai placé le constructeur en le forçant à lever une exception pour rendre l’instanciation impossible, ce qui est le propre d’une classe abstraite. Ceci nous force à « répéter » la méthode initialize dans les classes filles, mais ce n’est pas bien grave car le jour où elles seront amenées à différer selon les cas, elles seront déjà isolées dans les bonnes sous-classes. Le but était de rester le plus fidèle possible à ce qu’est ce design pattern, tout en prenant en compte les contraintes du langage.
class ProduitEntretien def initialize raise "Impossible d'instancier la classe ProduitEntretien" end def points_vente raise NotImplementedError end attr_reader :caracteristiques end class LessiveIndustrielle < ProduitEntretien def initialize(caracteristiques) @caracteristiques = caracteristiques end def points_vente [ 'Grande Distribution' ] end end class ProduitVaisselleIndustriel < ProduitEntretien def initialize(caracteristiques) @caracteristiques = caracteristiques end def points_vente [ 'Grande Distribution' ] end end class LessiveEcologique < ProduitEntretien def initialize(caracteristiques) @caracteristiques = caracteristiques end def points_vente [ 'Grande Distribution' , 'Supérettes Bio' , 'Marchés' ] end end class ProduitVaisselleEcologique < ProduitEntretien def initialize(caracteristiques) @caracteristiques = caracteristiques end def points_vente [ 'Supérettes Bio' , 'Marchés' ] end end class FabriqueProduitEntretien def initialize raise "Impossible d'instancier la classe FabriqueProduitEntretien" end def fabriquer_lessive raise NotImplementedError end def fabriquer_produit_vaisselle raise NotImplementedError end end class FabriqueProduitEntretienEcologique < FabriqueProduitEntretien def initialize # TODO: à compléter end def fabriquer_lessive LessiveEcologique. new ([ 'tensioactifs' => 'naturels' , 'colorants' => 'naturels' , 'parfum' => 'huiles essentielles' ]) end def fabriquer_produit_vaisselle ProduitVaisselleEcologique. new ([ 'base' => 'savon Marseille' , 'additifs' => [ 'soude' , 'vinaigre' ]]) end end class FabriqueProduitEntretienIndustriel < FabriqueProduitEntretien def initialize # TODO: à compléter end def fabriquer_lessive LessiveIndustrielle. new ([ 'tensioactifs' => 'chimiques' , 'colorants' => 'chimiques' , 'parfum' => 'synthétiques' ]) end def fabriquer_produit_vaisselle ProduitVaisselleIndustriel. new ([ 'tensioactifs' => 'chimiques' , 'colorants' => 'chimiques' , 'parfum' => 'synthétiques' ]) end end fabrique_industrielle = FabriqueProduitEntretienIndustriel. new lessive_industrielle = fabrique_industrielle.fabriquer_lessive produit_vaisselle_industriel = fabrique_industrielle.fabriquer_produit_vaisselle fabrique_ecologique = FabriqueProduitEntretienEcologique. new lessive_ecologique = fabrique_ecologique.fabriquer_lessive produit_vaisselle_ecologique = fabrique_ecologique.fabriquer_produit_vaisselle p produit_vaisselle_industriel.points_vente p produit_vaisselle_ecologique.points_vente p produit_vaisselle_industriel.caracteristiques p produit_vaisselle_ecologique.caracteristiques |