# Patrons de conception/Chargement différé

* Introduction
* Patrons du « Gang of Four »
** Patrons de création
*** Singleton
*** Prototype
*** Fabrique
*** Fabrique abstraite
*** Monteur
** Patrons de structure
*** Pont
*** Façade
*** Adaptateur
*** Objet composite
*** Proxy
*** Poids-mouche
*** Décorateur
** Patrons de comportement
*** Chaîne de responsabilité
*** Commande
*** Interpréteur
*** Itérateur
*** Médiateur
*** Mémento
*** Observateur
*** État
*** Stratégie
*** Patron de méthode
*** Visiteur
* Patrons GRASP
** Expert en information
** Créateur
** Faible couplage
** Forte cohésion
** Contrôleur
** Polymorphisme
** Fabrication pure
** Indirection
** Protection
* Patrons d'entreprise
** Logique du domaine
*** Script de transaction
*** Modèle du domaine
*** Module de table
*** Couche de service
** Architecture de source de données
*** Passerelle de table de données
*** Passerelle de ligne de données
*** Enregistrement actif
*** Gestion de données
** Comportement objet-relationnel
*** Unité de travail
*** Carte d'identité
*** Chargement différé
** Structure objet-relationnel
** Association méta-données objet-relationnel
** Présentation web
** Distribution
** Concurrence locale (hors-ligne)
** État de session (Session State Patterns)
** Patrons de base
*** Passerelle (Gateway)
*** Mapper
*** Type de base pour la couche
*** Interface séparée
*** Registre
*** Plugin
*** Objet valeur
*** Monnaie
*** Cas spécial
*** Service de substitution
*** Ensemble d'enregistrements
* Autres patrons
** Type fantôme
** Double-dispatch
** Post-Redirect-Get
** Map-Reduce
** Évaluation retardée
** Copie sur modification
** Injection de dépendance
** Inversion de contrôle
** Modèle-Vue-Contrôleur
** Modèle-Vue-Présentateur
** Écart de génération
** Objet nul
** Objets réutilisables
** Outbox
** Feature toggles
* Bibliographie et liens
* Introduction
* Patrons du « Gang of Four »
** Patrons de création
*** Singleton
*** Prototype
*** Fabrique
*** Fabrique abstraite
*** Monteur
** Patrons de structure
*** Pont
*** Façade
*** Adaptateur
*** Objet composite
*** Proxy
*** Poids-mouche
*** Décorateur
** Patrons de comportement
*** Chaîne de responsabilité
*** Commande
*** Interpréteur
*** Itérateur
*** Médiateur
*** Mémento
*** Observateur
*** État
*** Stratégie
*** Patron de méthode
*** Visiteur
* Patrons GRASP
** Expert en information
** Créateur
** Faible couplage
** Forte cohésion
** Contrôleur
** Polymorphisme
** Fabrication pure
** Indirection
** Protection
* Patrons d'entreprise
** Logique du domaine
*** Script de transaction
*** Modèle du domaine
*** Module de table
*** Couche de service
** Architecture de source de données
*** Passerelle de table de données
*** Passerelle de ligne de données
*** Enregistrement actif
*** Gestion de données
** Comportement objet-relationnel
*** Unité de travail
*** Carte d'identité
*** Chargement différé
** Structure objet-relationnel
** Association méta-données objet-relationnel
** Présentation web
** Distribution
** Concurrence locale (hors-ligne)
** État de session (Session State Patterns)
** Patrons de base
*** Passerelle (Gateway)
*** Mapper
*** Type de base pour la couche
*** Interface séparée
*** Registre
*** Plugin
*** Objet valeur
*** Monnaie
*** Cas spécial
*** Service de substitution
*** Ensemble d'enregistrements
* Autres patrons
** Type fantôme
** Double-dispatch
** Post-Redirect-Get
** Map-Reduce
** Évaluation retardée
** Copie sur modification
** Injection de dépendance
** Inversion de contrôle
** Modèle-Vue-Contrôleur
** Modèle-Vue-Présentateur
** Écart de génération
** Objet nul
** Objets réutilisables
** Outbox
** Feature toggles
* Bibliographie et liens
[ Modifier le sommaire ]
Pour charger des données d'une base de données en mémoire, il est pratique de concevoir les choses de sorte que lorsque vous chargez un objet d'intérêt, vous chargez également les objets qui lui sont liés. Cela facilite le chargement pour le développeur utilisant l'objet, qui doit sinon charger explicitement tous les objets dont il a besoin.
Cependant, en conclusion logique, vous arrivez au point où le chargement d'un objet peut avoir pour effet de charger un grand nombre d'objets liés, ce qui nuit aux performances lorsque seuls quelques objets sont réellement nécessaires.
Un chargement différé interrompt ce processus de chargement pour le moment, laissant un marqueur dans la structure de l'objet de sorte que lorsque les données sont nécessaires, elles ne puissent être chargées que lorsqu'elles sont utilisées. Si vous évitez de faire des choses, cela devient un gain quand il s'avère que vous n'avez pas du tout besoin de les faire.
Il existe quatre principales variétés de chargement différé/paresseux :
* L'initialisation différée utilise une valeur de marqueur spéciale (généralement nulle) pour indiquer qu'un champ n'est pas chargé. Chaque accès au champ vérifie si le champ vaut le marqueur et s'il est déchargé, le charge.
* Le proxy virtuel est un objet avec la même interface que l'objet réel. La première fois qu'une de ses méthodes est appelée, elle charge l'objet réel puis délègue (voir Proxy).
* Le détenteur de valeur est un objet avec une méthode getValue. Les clients appellent getValue pour obtenir l'objet réel, le premier appel déclenche le chargement.
* Un fantôme est l'objet réel sans aucune donnée. La première fois que vous appelez une méthode, le fantôme charge les données complètes dans ses champs.
Ces approches varient quelque peu subtilement et comportent divers compromis. Vous pouvez également utiliser des approches combinées.