17.12.2012 Views

Programmation PYTHON - Zenk - Security - Repository

Programmation PYTHON - Zenk - Security - Repository

Programmation PYTHON - Zenk - Security - Repository

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

504<br />

Techniques avancées<br />

QUATRIÈME PARTIE<br />

Ce pattern est cependant dépendant d’éventuelles implémentations des méthodes<br />

__setattr__() et __getattribute__() qui peuvent court-circuiter __dict__.<br />

D’autres variations existent, comme Flyweight, qui proposent un fonctionnement<br />

similaire à Singleton, mais gèrent un certain nombre d’instances définies par des<br />

combinaisons de paramètres au moment de la construction, afin d’optimiser les créations<br />

d’objets en mémoire lorsque c’est important.<br />

Factory<br />

Le DP Factory est une fonction ou méthode qui renvoie une ou plusieurs instances<br />

d’objets. Factory est omniprésent en Python, et l’exemple le plus parlant est la primitive<br />

type().<br />

Exemple d’utilisation de type()<br />

>>> MaClasse = type('MaClasse', (object,), {'a': 1})<br />

>>> A = MaClasse()<br />

>>> A.a<br />

1<br />

>>> class MaClasse(object):<br />

... a = 1<br />

...<br />

>>> A = MaClasse()<br />

>>> A.a<br />

1<br />

La première écriture permet de générer tout type de classe et est équivalente à la<br />

deuxième écriture explicite. Un autre exemple de Factory est la méthode __new__()<br />

des new-style classes, qui contrôle la génération des instances de la classe.<br />

Le champ d’action du DP Factory est relativement large et on peut se demander si<br />

finalement, toute fonction qui renvoie un résultat ne répond pas à ce pattern, puisque<br />

tout est objet en Python.<br />

Il y a cependant un exemple d’utilisation plus concret de ce DP : lorsque le type<br />

d’objet renvoyé par le Factory varie sans que le code appelant ne soit sensible à cette<br />

variation. On parle dans ce cas d’Abstract Factory.<br />

Par exemple, un Abstract Factory en charge de renvoyer une instance de connecteur<br />

de base de données peut le faire en partant du postulat que le type d’objet renvoyé<br />

importe peu, du moment qu’il dérive de la classe BaseDB. Le code appelant ne se<br />

basant que sur les méthodes définies par BaseDB, il reste insensible au type de l’objet,<br />

que ce soit OracleDB ou PostGresDB.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!