0% ont trouvé ce document utile (0 vote)
186 vues19 pages

Modèle de Factory pour Pizzerias

Ce document décrit l'utilisation du patron de conception Factory pour créer différents types de pizzas. Une classe SimplePizzaFactory est utilisée pour encapsuler la logique de création des pizzas concrètes afin de la rendre plus flexible et extensible. Le code de création des pizzas est ainsi isolé dans cette classe factory plutôt que d'être dispersé dans la classe PizzaStore.

Transféré par

najd msedi
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
186 vues19 pages

Modèle de Factory pour Pizzerias

Ce document décrit l'utilisation du patron de conception Factory pour créer différents types de pizzas. Une classe SimplePizzaFactory est utilisée pour encapsuler la logique de création des pizzas concrètes afin de la rendre plus flexible et extensible. Le code de création des pizzas est ainsi isolé dans cette classe factory plutôt que d'être dispersé dans la classe PizzaStore.

Transféré par

najd msedi
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Le patron

"Factory"

79
Riadh BEN HALIMA [Design patterns]
PizzaStore :
Créer des pizzas (1/37)
 Pizzeria: Créer des pizzas
Pour la flexibilité, on veut que
Pizza orderPizza(){ celui-ci soit une classe abstraite ou
Pizza pizza=new Pizza(); interface, sauf qu’on ne peut pas
instancier l’un des deux derniers!
[Link]();
[Link]();
[Link]();
[Link]();
return pizza;
}

 On veut plus qu’un type de pizza….

80
Riadh BEN HALIMA [Design patterns]
PizzaStore :
Plusieurs types de pizza (2/37)
 Pizzeria: Créer plusieurs types de pizza
On passe le type du pizza à travers
Pizza orderPizza( String type ){
le méthode orderPizza()
Pizza pizza;

if ("cheese".equals(type)){
pizza=new CheesePizza();
} else if ("greek".equals(type)){ Selon le type de pizza, on crée la
pizza=new GreekPizza(); pizza concrète, et on la place dans
} else if ("pepperoni".equals(type)){ la variable "pizza" (interface et
pizza=new PepperoniPizza(); classe mère des pizzas).
}

[Link]();
[Link](); Une fois on a la pizza, on prépare la sauce, le
[Link](); nappage (tomate/crême fraiche) et le fromage ,
[Link](); puis on la fait cuire, la coupe, et on la met dans
return pizza; une boite.
}

81
Riadh BEN HALIMA [Design patterns]
PizzaStore :
Autres types de pizza (3/37)
 Les concurrents ont ajouté un nouveau type de pizza: (avec Calamars)
 Ajouter ClamPizza au menu
 On n’a pas vendu beaucoup de GreekPizza dernièrement
 Suspendre GreekPizza du menu
Pizza orderPizza(String type){
Pizza pizza;
if ([Link]("cheese"){
Ce code est NON fermé

pizza=new CheesePizza();
pour la modification!

} else if ([Link]("greek"){ Partie variable: On modifie


pizza=new GreekPizza(); le code autant que la
} else if ([Link]("pepperoni"){ sélection de pizza change.
pizza=new PepperoniPizza();
} else if ([Link]("clam"){
pizza=new ClamPizza();
}
[Link]();
[Link](); Partie invariable: Généralement, ces opérations
[Link](); sont les mêmes pour des années et des années.
[Link]();
return pizza;
82 }
Riadh BEN HALIMA [Design patterns]
PizzaStore :
Encapsuler la création (4/37)
 Règle 1 de l’OO: Encapsuler ce qui varie
if ([Link]("cheese"){
pizza=new CheesePizza();
} else if ([Link]("pepperoni"){
pizza=new PepperoniPizza();
} else if ([Link]("clam"){
pizza=new ClamPizza();
}
Pizza orderPizza(String type){
Pizza pizza;

On place ce code dans un objet qui s’occupera de la


création des pizzas concrètes. Si un autre objet a besoin
d’une pizza concrète, c’est cet objet qu’il faut appeler.
[Link]();
[Link]();
[Link]();
[Link]();
return pizza;
}

83 On attribue le nom
RiadhFactory à ce nouvel
BEN HALIMA objet
[Design patterns]
PizzaStore :
Un Simple Factory (5/37)
 Le seul rôle de SimplePizzaFactory est de créer des pizzas pour ces
clients
Initialement, on définit la méthode
createPizza() dans le Factory. C’est la
public class SimplePizzaFactory { méthode que tous les clients utilisent
public Pizza createPizza(String type){ pour instancier des nouveaux objets.
Pizza pizza=null;

if ([Link]("cheese"){
pizza=new CheesePizza();
} else if ([Link]("pepperoni"){
pizza=new PepperoniPizza();
} else if ([Link]("clam"){
pizza=new ClamPizza();
} C’est le code qu’on a retirer de la
méthode orderPizza().
return pizza;
}
}

84
Riadh BEN HALIMA [Design patterns]
PizzaStore :
Retravaillons la classe PizzaStore (6/37)
 Maintenant, PizzaStore utilise SimplePizzaFactory pour créer des pizzas
PizzaStore récupère la
public class PizzaStore {
référence du factory à
private SimplePizzaFactory factory;
travers le constructeur.
public PizzaStore(SimplePizzaFactory factory){
[Link]=factory;
}
public Pizza orderPizza(String type){
Pizza pizza;
pizza=[Link](type);
[Link]();
[Link](); La méthode orderPizza() utilise le
[Link](); factory pour créer ses pizzas.
[Link]();
return pizza;
}
}
 Noter qu’on a remplacé l’opérateur new par une méthode concrète
 Plus d’instanciation concrète ici
85
Riadh BEN HALIMA [Design patterns]
PizzaStore :
Le diagramme de classes (7/37)
Elle doit être la seule partie de On définit Pizza comme
notre application qui pointe vers les classe abstraite, avec quelque
classes des pizzas concrètes implémentations qui peuvent
être redéfinies
PizzaStore SimplePizzaFactory Pizza
prepare()
orderPizza() createPizza() bake()
cut()
box()
La méthode de création
est souvent statique

CheesePizza ClamPizza
PizzaStore crée des PepperoniPizza
instances à travers
SimplePizzaFactory

Chaque produit implémente la classe abstraite Pizza


 Actuellement, Simple Factory n’est pas un patron. C’est plutôt un
"style" de programmation
86
Riadh BEN HALIMA [Design patterns]
Résumé
 1 seule méthode create  style de programmation ‘Simple Factory’

 Plusieurs méthodes create avec relation d’héritage: Design Pattern

* create() je la place dans des create () abstract


classes métiers existantes: DP
Factory Method

* Je crée des nouvelles classes


create () create ()
dédiées pour placer les
méthodes create(): DP
Abstract Factory retourne une instance
retourne une instance
d’une première famille d’une 2ème famille d'objets
d'objets

87
Riadh BEN HALIMA [Design patterns]
PizzaStore :
Franchise de PizzaStore (8/37)
 Objectif: Franchiser PizzaStore: Créer plusieurs stores dans
plusieurs villes (Sfax, Tunis, etc.)
 Besoin: Développer une application qui gère la création des
pizzas pour chaque store
 Chaque store offre différent types de pizza
 Conception: OO
Moins de fromage dans
les pizzas, etc.

Des pizzas familles de


grande taille, beaucoup
de fromage, etc.
88
Riadh BEN HALIMA [Design patterns]
PizzaStore :
Différent styles des PizzaStores (9/37)
 Si on prépare les mêmes pizzas Créer des pizzas à travers
SfaxPizzaFactory
SfaxPizzaFactory sffactory = new SfaxPizzaFactory();
PizzaStore sfstore = new PizzaStore(sffactory);
[Link]("cheese"); Créer les mêmes pizzas à
travers TunisPizzaFactory

TunisPizzaFactory tnfactory = new TunisPizzaFactory();


PizzaStore tnstore = new PizzaStore(tnfactory);
[Link]("cheese");

 Et si chaque PizzaStore prépare ses propres styles de pizza


Je prépare les pizzas depuis des
années et je veux ajouter mes propres
touches d’amélioration des procédures de
mon PizzaStore

89
Riadh BEN HALIMA [Design patterns]
PizzaStore :
Le framework de PizzaStore (10/37)
 On donne la liberté aux franchises de créer leurs propres styles
 Déplacer la création dans une la méthode createPizza() et garder la
même méthode orderPizza() pour tous les stores
 Chaque région l’étend afin de spécifier son propre style
public abstract class PizzaStore {

public Pizza orderPizza(String type){


Pizza pizza; CreatePizza() est une
méthode PizzaStore plutôt
pizza = createPizza(type); que dans le Factory
[Link]();
[Link](); Tout ceci apparaît le même
[Link](); On a transféré notre objet
[Link](); Factory dans cette méthode
return pizza;
}
public abstract Pizza createPizza(String type);
}
Notre "méthode Factory" est
90
maintenant abstraite dans PizzaStoreRiadh BEN HALIMA [Design patterns]
PizzaStore :
Les styles de pizzas (11/37)
PizzaStore Méthode abstraite, à définir
dans les classes dérivées
createPizza()
orderPizza()

Créer des pizzas


Créer des pizzas SfaxStylePizzaStore TunisStylePizzaStore avec les ingrédients
avec les ingrédients spécifiques à Tunis
spécifiques à Sfax createPizza() createPizza()

@Override @Override
public Pizza createPizza(String type) { public Pizza createPizza(String type) {
Pizza pizza=null; Pizza pizza=null;
if ("cheese".equals(type)){ if ("cheese".equals(type)){
pizza=new SfaxStyleCheesePizza(); pizza=new TunisStyleCheesePizza();
} else if ("pepperoni".equals(type)){ } else if ("pepperoni".equals(type)){
pizza=new SfaxStylePepperoniPizza(); pizza=new TunisStylePepperoniPizza();
} else if ("clam".equals(type)){ } else if ("clam".equals(type)){
pizza=new SfaxStyleClamPizza(); pizza=new TunisStyleClamPizza();
} }
return pizza; return pizza;
} }
91
Riadh BEN HALIMA [Design patterns]
PizzaStore :
Un PizzaStore de Style Sfaxien (12/37)
 Les bénéfices d’une franchise
 On obtient des fonctionnalités des pizzas communes (prepare(), bake(), cut() et box())
 Chaque région définit sa propre méthode createPizza() qui spécifie son style de pizza
public class SfaxStylePizzaStore extends PizzaStore {
Pizza createPizza(String type) {
Pizza pizza=null; On hérite la méthode
if ("cheese".equals(type)){ orderPizza() de PizzaStore
pizza=new SfaxStyleCheesePizza();
} else if ("pepperoni".equals(type)){ On implémente createPizza()
pizza=new SfaxStylePepperoniPizza(); puisqu’elle est abstraite:
} else if ("clam".equals(type)){ C’est la "méthode Factory"
pizza=new SfaxStyleClamPizza();
}
return pizza; Créer des pizzas du style sfaxien!!
}
 Rq: Toutes les responsabilités d’instanciation sont déplacées vers la méthode
createPizza() qui agit comme un factory
 La méthode factory gère la création des objets et leur encapsulation
 Découplage du code du client dans la supère classe de la création de l’objet dans les sous-
classes
92
Riadh BEN HALIMA [Design patterns]
PizzaStore :
Commander des pizzas (13/37)
Je voudrai une pizza Je voudrai une pizza
de grande taille avec beaucoup de taille moyenne avec
de fromage du style peu de fromage et au thon
tunisois du style sfaxien

PizzaStore tunisps = PizzaStore sfaxps =


new TunisStylePizzaStore(); new SfaxStylePizzaStore();

Instance du store spécifique

Prendre des commandes

[Link]("cheese"); [Link]("cheese");

C’est une méthode de l’instance tunisps (respectivement


sfaxps), définie dans la classe PizzaStore
93
Riadh BEN HALIMA [Design patterns]
PizzaStore :
Commander des pizzas (14/37)
[Link]("cheese"); [Link]("cheese");

La méthode orderPizza() appelle createPizza()

Pizza pizza= createPizza("cheese"); Pizza pizza= createPizza("cheese");

La méthode createPizza() est implémentée dans la classe dérivée


Elle retourne une pizza au Elle retourne une pizza au
fromage style tunisois fromage style sfaxien

On termine la préparation
[Link](); [Link]();
[Link](); [Link]();
[Link](); [Link]();
[Link](); [Link]();

94
De style tunisois DeRiadh
styleBEN
sfaxien
HALIMA [Design patterns]
PizzaStore :
Implémenter (15/37) Les créateurs
PizzaStore
 Implémenter les classes: createPizza()
[Link], [Link] orderPizza()
Factory Method
et [Link]
SfaxStylePizzaStore TunisStylePizzaStore
createPizza() createPizza()

 Implémenter les classes: [Link], Les produits


[Link], Pizza
[Link],
[Link],
[Link],
[Link], SfaxStyleCheesePizza TunisStyleCheesePizza
[Link] SfaxStyleClamPizza TunisStyleClamPizza

SfaxStylePepperoniPizza
TunisStylePepperoniPizza

95
Riadh BEN HALIMA [Design patterns]
PizzaStore :
Le patron Factory Method (16/37)

 Définition: Factory Method


 Le patron factory method définit une interface de
création des objets, et laisse les classes-dérivées décider de
la classe de l’instanciation. La méthode factory permet à
une classe de déléguer l’instanciation à ces classes dérivées.

96
Riadh BEN HALIMA [Design patterns]
PizzaStore :
Le diagramme de classes du patron (17/37)
La classe mère de tous les produits Le Creator est une classe qui contient
concrets. Elle représente aussi le type l’implémentation de toutes les
générique qui référence vers les méthodes qui manipulent le produits,
instances des classes concrètes à l’exception de factoryMethod()

Product Creator La méthode abstraite


factoryMethod() factoryMethod() que tous les
anOperation() dérivés de la classe Creator
implémentent

Le ConcretCreator
implémente la méthode
factoryMethod(), qui produit
ConcretProduct ConctretCreator les produits
factoryMethod()
La décision: choix
Le ConcretCreator est responsable de la création de produits du produit concret
concrets. C’est la classe qui connait le qui a créé chaque produit
97
Riadh BEN HALIMA [Design patterns]

Vous aimerez peut-être aussi