Factory Design Patterns Factory Method. Factory Method Design Pattern Plan Factory :...

22
Factory Design Patterns Factory Design Patterns Factory Method Factory Method

Transcript of Factory Design Patterns Factory Method. Factory Method Design Pattern Plan Factory :...

Page 1: Factory Design Patterns Factory Method. Factory Method Design Pattern Plan Factory : principesFactory : principes The Factory Method patternThe Factory.

Factory Design PatternsFactory Design Patterns

Factory MethodFactory Method

Page 2: Factory Design Patterns Factory Method. Factory Method Design Pattern Plan Factory : principesFactory : principes The Factory Method patternThe Factory.

Factory Method Design PatternFactory Method Design Pattern

PlanPlan

• Factory : principesFactory : principes

• The Factory Method patternThe Factory Method pattern

• The Abstract Factory patternThe Abstract Factory pattern

““Design patterns are recurring solutions to design Design patterns are recurring solutions to design problems you see over and over.” problems you see over and over.”

[Smalltalk Companion][Smalltalk Companion]

Page 3: Factory Design Patterns Factory Method. Factory Method Design Pattern Plan Factory : principesFactory : principes The Factory Method patternThe Factory.

Factory Method Design PatternFactory Method Design Pattern

IntentionIntention

Portée: classesPortée: classes

• Définir une interface pour la création d’un Définir une interface pour la création d’un objet, mais laisser les sous-classes décider objet, mais laisser les sous-classes décider de la classe à instancierde la classe à instancier

• Une classe délègue l’instanciation à ses Une classe délègue l’instanciation à ses sous-classes. sous-classes.

Page 4: Factory Design Patterns Factory Method. Factory Method Design Pattern Plan Factory : principesFactory : principes The Factory Method patternThe Factory.

Factory Method Design PatternFactory Method Design Pattern

MotivationMotivation

• PROBLEMEPROBLEME::• Un framework possède Un framework possède

• des classes abstraites par rapport aux des classes abstraites par rapport aux applicationsapplications

• des sous-classes spécifiques aux applications des sous-classes spécifiques aux applications pour réaliser différentes implémentationspour réaliser différentes implémentations

• SOLUTIONSOLUTION::• Le Factory Method pattern Le Factory Method pattern

• encapsule les connaissances encapsule les connaissances sur quelles sous-classes il faut instanciersur quelles sous-classes il faut instancier

• déplace ces connaissances à l’extérieur du déplace ces connaissances à l’extérieur du frameworkframework

Page 5: Factory Design Patterns Factory Method. Factory Method Design Pattern Plan Factory : principesFactory : principes The Factory Method patternThe Factory.

Factory Method Design PatternFactory Method Design Pattern

Exemple IExemple I

Page 6: Factory Design Patterns Factory Method. Factory Method Design Pattern Plan Factory : principesFactory : principes The Factory Method patternThe Factory.

Factory Method Design PatternFactory Method Design Pattern

Exemple IIExemple II

• Enterprise JavaBean (EJB) Application:Enterprise JavaBean (EJB) Application:• Un bean Un bean entitéentité est une représentation objet de données persistentes est une représentation objet de données persistentes

ces données sont placées sur un support persistent, e.g. une base de données. ces données sont placées sur un support persistent, e.g. une base de données. • Une clé primaire identifie chaque instance d’un bean Une clé primaire identifie chaque instance d’un bean entitéentité..• Les beans Les beans entitésentités sont créés en instanciant un objet via une méthode factory ( sont créés en instanciant un objet via une méthode factory (create)create). .

• Le même principe s’applique pour les beans de Le même principe s’applique pour les beans de sessionsession..

Page 7: Factory Design Patterns Factory Method. Factory Method Design Pattern Plan Factory : principesFactory : principes The Factory Method patternThe Factory.

Factory Method Design PatternFactory Method Design Pattern

Exemple II (suite)Exemple II (suite)

import javax.naming.*; import javax.naming.*;

public class EJBClient { public class EJBClient {

public static void main (String[] argv) public static void main (String[] argv)

{{ // get the JNDI naming context // get the JNDI naming context

Context initialCtx = new InitialContext ();Context initialCtx = new InitialContext ();

// use the context to lookup the EJB Home interface // use the context to lookup the EJB Home interface

AccountHome home=(AccountHome)initialCtx.lookup("Account"); AccountHome home=(AccountHome)initialCtx.lookup("Account");

// use the Home Interface to create a Session bean object // use the Home Interface to create a Session bean object

Account account = home.create (10001, "Athul", 100000000.25d); Account account = home.create (10001, "Athul", 100000000.25d);

// invoke business methods // invoke business methods

account.credit (200000000.25d); account.credit (200000000.25d);

// remove the object // remove the object

account.remove (); account.remove ();

}}

}}

Page 8: Factory Design Patterns Factory Method. Factory Method Design Pattern Plan Factory : principesFactory : principes The Factory Method patternThe Factory.

Factory Method Design PatternFactory Method Design Pattern

StructureStructure

• Les sous-classes redéfinissent les méthodes abstraites de la classe abstraite Les sous-classes redéfinissent les méthodes abstraites de la classe abstraite pour rendre la sous-classe appropriéepour rendre la sous-classe appropriée

Page 9: Factory Design Patterns Factory Method. Factory Method Design Pattern Plan Factory : principesFactory : principes The Factory Method patternThe Factory.

Factory Method Design PatternFactory Method Design Pattern

CollaborationCollaboration

• La classe La classe CreatorCreator s’appuie sur ses sous-s’appuie sur ses sous-classes pour définir une méthode classes pour définir une méthode “factory” qui rend une instance de la “factory” qui rend une instance de la classe appropriée classe appropriée ConcreteProductConcreteProduct

Page 10: Factory Design Patterns Factory Method. Factory Method Design Pattern Plan Factory : principesFactory : principes The Factory Method patternThe Factory.

Factory Method Design PatternFactory Method Design Pattern

Quand l’appliquer?Quand l’appliquer?

• Lorsque la classe qui doit instancier des classes ne Lorsque la classe qui doit instancier des classes ne connaît que les classes abstraites.connaît que les classes abstraites.• La classe ne connaît que le moment de la création d’un objet, La classe ne connaît que le moment de la création d’un objet, • mais ne connaît pas quelle sorte d’objets, elle doit créer mais ne connaît pas quelle sorte d’objets, elle doit créer

parce que cet objet dépend de l’applicationparce que cet objet dépend de l’application

• Une classe veut que ses sous-classes spécifient quels Une classe veut que ses sous-classes spécifient quels objets seront créésobjets seront créés

• Les classes délèguent la responsabilité à une ou Les classes délèguent la responsabilité à une ou plusieurs sous-classes d’aide plusieurs sous-classes d’aide • on désire rendre locales les connaissances qui vont aider on désire rendre locales les connaissances qui vont aider

à déterminer quel sera la classe d’aide dans une situation à déterminer quel sera la classe d’aide dans une situation donnéedonnée

Page 11: Factory Design Patterns Factory Method. Factory Method Design Pattern Plan Factory : principesFactory : principes The Factory Method patternThe Factory.

Factory Method Design PatternFactory Method Design Pattern

Implémentations - Implémentations - VariationsVariations

1.1. __ __ • Une classe abstraite définit la méthode “factory” abstraite Une classe abstraite définit la méthode “factory” abstraite

• Alternative: une interface contient les signatures de créationAlternative: une interface contient les signatures de création• Les sous-classes de la classe abstraite implémentent Les sous-classes de la classe abstraite implémentent

l’interfacel’interface

2.2. __ __ • Une classe concrète possède une implémentation par Une classe concrète possède une implémentation par

défaut de la méthode “factory” défaut de la méthode “factory” • Les sous-classes redéfinissent ou non la méthode Les sous-classes redéfinissent ou non la méthode

“factory”“factory”

3.3. ____• La méthode “factory” possède un paramètre qui identifie La méthode “factory” possède un paramètre qui identifie

la sorte d’objet à créerla sorte d’objet à créer

Page 12: Factory Design Patterns Factory Method. Factory Method Design Pattern Plan Factory : principesFactory : principes The Factory Method patternThe Factory.

Factory Method Design PatternFactory Method Design Pattern

Factory Method: diagramme de classe IFactory Method: diagramme de classe I

factory method

Page 13: Factory Design Patterns Factory Method. Factory Method Design Pattern Plan Factory : principesFactory : principes The Factory Method patternThe Factory.

Factory Method Design PatternFactory Method Design Pattern

Factory Method: diagramme de Factory Method: diagramme de classe IIclasse II

• Invocation de la Invocation de la factory methodfactory method createDocument()createDocument() qui est responsable de la construction des objetsqui est responsable de la construction des objets

factory method

Page 14: Factory Design Patterns Factory Method. Factory Method Design Pattern Plan Factory : principesFactory : principes The Factory Method patternThe Factory.

Factory Method Design PatternFactory Method Design Pattern

Bénéfices et Bénéfices et désavantages Idésavantages I

• Les méthodes “factory” éliminent le besoin de Les méthodes “factory” éliminent le besoin de lier des classes spécifiques à une application lier des classes spécifiques à une application dans le code dans le code

• Le code n’intervient qu’avec l’interface du Le code n’intervient qu’avec l’interface du produit et peut ainsi travailler avec produit et peut ainsi travailler avec n’importe n’importe quellequelle classe concrète définie par l’usager classe concrète définie par l’usager

• Les clients peuvent devoir sous-classer la classe Les clients peuvent devoir sous-classer la classe CreatorCreator uniquement pour créer un type uniquement pour créer un type particulier d’objet particulier d’objet ConcreteProductConcreteProduct

Page 15: Factory Design Patterns Factory Method. Factory Method Design Pattern Plan Factory : principesFactory : principes The Factory Method patternThe Factory.

Factory Method Design PatternFactory Method Design Pattern

Bénéfices et Bénéfices et désavantages IIdésavantages II

• Fournir des points d’arrimage (“hook”) Fournir des points d’arrimage (“hook”) pour les sous-classespour les sous-classes• La création d’objets à l’intérieur d’une La création d’objets à l’intérieur d’une

classe à l’aide d’une méthode “factory” est classe à l’aide d’une méthode “factory” est toujours plus flexible que la création directe toujours plus flexible que la création directe de l’objet. de l’objet.

Page 16: Factory Design Patterns Factory Method. Factory Method Design Pattern Plan Factory : principesFactory : principes The Factory Method patternThe Factory.

Factory Method Design PatternFactory Method Design Pattern

Bénéfices et Bénéfices et désavantages IIIdésavantages III

• Connexion de hiérarchies parallèles Connexion de hiérarchies parallèles • Les hiérarchies parallèles de classes Les hiérarchies parallèles de classes

surviennent lorsqu’une classe délègue une surviennent lorsqu’une classe délègue une partie de ses responsabilités à une classe partie de ses responsabilités à une classe séparéeséparée

Page 17: Factory Design Patterns Factory Method. Factory Method Design Pattern Plan Factory : principesFactory : principes The Factory Method patternThe Factory.

Factory Method Design PatternFactory Method Design Pattern

Choix d’implémentation Choix d’implémentation II

• Deux variantes principalesDeux variantes principales

• La classeLa classe CreatorCreator est une classe est une classe abstraiteabstraite et ne fournit pas d’implémentation par et ne fournit pas d’implémentation par défaut de la méthode “factory”défaut de la méthode “factory”

• La classeLa classe CreatorCreator est une classe est une classe concrèteconcrète et fournit une implémentation par défaut et fournit une implémentation par défaut de la méthode “factory”de la méthode “factory”

Page 18: Factory Design Patterns Factory Method. Factory Method Design Pattern Plan Factory : principesFactory : principes The Factory Method patternThe Factory.

Factory Method Design PatternFactory Method Design Pattern

Choix d’implémentation Choix d’implémentation IIII

• La méthodeLa méthode ““factoryfactory” est paramétrée” est paramétrée..

• Une variation sur ce patron permet à la Une variation sur ce patron permet à la méthode “factory” de créer plusieurs sortes méthode “factory” de créer plusieurs sortes de produits. de produits.

• La méthode “factory” possède un paramètre La méthode “factory” possède un paramètre qui identifie la sorte d’objet à créer.qui identifie la sorte d’objet à créer.

• Tous les objets créés par la méthode Tous les objets créés par la méthode “factory” partagent l’interface “factory” partagent l’interface ProductProduct. .

Page 19: Factory Design Patterns Factory Method. Factory Method Design Pattern Plan Factory : principesFactory : principes The Factory Method patternThe Factory.

Factory Method Design PatternFactory Method Design Pattern

Factory Method: Factory Method: exemple IIexemple II

public abstract class TablesCreator {… public abstract TableCodeCreator getTableCodeCreator(String dbName) ; }public interface TableCodeCreator {… void createSource(); }public class DB2TableCodeCreator implements TableCodeCreator {… public void createSource(padis.util.ClassInfoDescriptor descriptor, String

workingDir) { // CREATES JAVA SOURCE CODE FOR tableName.java FILES} }public class ConcreteTablesCreator extends TablesCreator {… public TableCodeCreator getTableCodeCreator(String dbName) { if (dbName.equals (“DB2”)) return new DB2TableCodeCreator(); else if (dbName.equals (“ORACLE”)) return new ORACLETableCodeCreator(); …} }

Classe abstraite

interface

Classe concrète

Classe concrète

Page 20: Factory Design Patterns Factory Method. Factory Method Design Pattern Plan Factory : principesFactory : principes The Factory Method patternThe Factory.

Factory Method Design PatternFactory Method Design Pattern

exemple II (suite)exemple II (suite)

// ConcreteTablesCreator// ConcreteTablesCreator

String dbname = String dbname = crs4.util.Configuration.getInstance().getProperty(crs4.util.Configuration.getInstance().getProperty(“default.database.name”“default.database.name”););

TableCodeCreator codeCreator = TableCodeCreator codeCreator = thisthis.getTableCodeCreator(dbname); .getTableCodeCreator(dbname); //read //read

from propertyfrom propertyfor for ((intint i=0; i<i=0; i<thisthis.getClassesArray().length; i++) .getClassesArray().length; i++) {{ codeCreator.createSource(codeCreator.createSource( thisthis.getClassesArray()[i], .getClassesArray()[i],

thisthis.getWorkingDirectory());.getWorkingDirectory()); }}

[création des tables à partir d’un schéma XML]

factory method

Page 21: Factory Design Patterns Factory Method. Factory Method Design Pattern Plan Factory : principesFactory : principes The Factory Method patternThe Factory.

Factory Method Design PatternFactory Method Design Pattern

Choix d’implémentation Choix d’implémentation IIIIII

• Conventions de noms (NConventions de noms (Naming aming conventionsconventions))

• Bonne pratique d’utiliser des conventions Bonne pratique d’utiliser des conventions de noms qui identifient clairement les de noms qui identifient clairement les méthodes “factory”méthodes “factory”. .

Page 22: Factory Design Patterns Factory Method. Factory Method Design Pattern Plan Factory : principesFactory : principes The Factory Method patternThe Factory.

Factory Method Design PatternFactory Method Design Pattern

RéférencesRéférences• E. Gamma, R. Helm, R. Johnson, J. Vlissides, E. Gamma, R. Helm, R. Johnson, J. Vlissides, Design Design

PatternsPatterns,, Addison-Wesley Professional Computing Addison-Wesley Professional Computing Series,Series, 1998.1998.

• J.W. Cooper, J.W. Cooper, Java Design PatternsJava Design Patterns – A Tutorial– A Tutorial, Addison-, Addison-Wesley, 2000.Wesley, 2000.

• G.S. Raj, G.S. Raj, Factory Method creational pattern, Factory Method creational pattern, http://gsraj.tripod.com/design/creational/factory/factorhttp://gsraj.tripod.com/design/creational/factory/factory.htmly.html