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