Dans le livre du Dr Yan Hong "Java and Mode", il commence par la description du mode Flyweight:
Le poids mouche fait référence au niveau de poids le plus léger, c'est-à-dire "poids mouche" ou "niveau de pluie". La traduction du "mode xienyuan" est choisie ici car cela peut mieux refléter l'intention du mode. Le modèle d'encyclopédie est le modèle structurel d'un objet. Le mode encyclopédie prend efficacement un grand nombre d'objets à grain fin de manière partagée.
Type de chaîne dans Java
Dans la langue Java, le type de chaîne utilise le mode Encyclopedia. L'objet String est de type final et ne peut pas être modifié une fois qu'il est créé. En Java, des constantes de cordes sont présentes dans le pool constant. Java garantira qu'une constante de chaîne n'a qu'une seule copie dans le pool constant. String a = "ABC", où "ABC" est une constante de chaîne.
Classe publique Test {public static void main (String [] args) {String a = "ABC"; String b = "ABC"; System.out.println (a == b); }}Le résultat dans l'exemple ci-dessus est vrai, ce qui signifie que A et B se réfèrent à la même chaîne constante "ABC" dans le pool constant. Une telle conception évite les grandes quantités inutiles de consommation de ressources générées lors de la création de n ou des objets plus identiques.
La structure du modèle de plaisir
Le modèle de plaisir adopte un partage pour éviter les frais généraux d'avoir le même objet de contenu. La chose la plus courante et la plus intuitive à propos de ces frais généraux est la perte de mémoire. La clé pour partager l'objet Encyclopedia est de distinguer l'état interne et l'état externe .
Un état intrinsèque est stocké à l'intérieur de l'objet Xiangyuan et ne variera pas selon l'environnement. Par conséquent, un élément sacrificiel peut avoir un état intrinsèque et peut être partagé.
Un état externe change avec le changement de l'environnement et ne peut pas être partagé. L'état externe de l'objet Xiangyuan doit être enregistré par le client, et une fois l'objet Xiangyuan créé, il est transmis dans l'objet Xiangyuan lorsqu'il doit être utilisé. Les états externes ne peuvent pas affecter l'état interne de l'objet vivant, ils sont indépendants les uns des autres.
Le mode PROFY Yuan peut être divisé en deux formes: le mode PROFY Yuan et le mode composite profitent du mode yuan.
Mode de plaisir simple
Dans le mode existant simple, tous les objets existants peuvent être partagés.
Les rôles impliqués dans le mode de plaisir simple sont les suivants:
Rôle du poids de la mouche abstrait: donne une interface abstraite pour spécifier les méthodes que tous les rôles de poids mouche spécifiques doivent être mis en œuvre.
Rôle de poids en béton: implémente l'interface spécifiée par le rôle abstrait de Xiangyuan. S'il y a un état intrinsèque, vous devez être responsable de fournir un espace de stockage pour l'état intrinsèque.
FlyweightFactory Rôle: ce rôle est responsable de la création et de la gestion du rôle de Xiangyuan. Ce rôle doit garantir que l'objet de plaisir peut être correctement partagé par le système. Lorsqu'un objet client appelle un objet Xiangyuan, le rôle d'usine Xiangyuan vérifiera s'il existe déjà un objet Xiangyuan qui répond aux exigences du système. S'il existe déjà, le rôle d'usine de Xiangyuan devrait fournir l'objet Xiangyuan existant; S'il n'y a pas d'objet Xiangyuan approprié dans le système, le rôle d'usine Xiangyuan devrait créer un objet Xiangyuan approprié.
code source
Classe de caractères abstraite
Interface publique Flyweight {// Une méthode schématique, l'état du paramètre est l'état externe Opération de void public (état de chaîne);}La classe de caractère spécifique de la classe de caractères en béton a un état intrinsèque. Dans cet exemple, une propriété intrinsèque du type de caractère représente et sa valeur doit être attribuée lorsque l'objet Encyclopedia est créé. Tous les états intrinsèques ne changeront pas une fois l'objet créé.
Si un objet sacrificiel a un état externe, tous les états externes doivent être stockés sur le client. Lorsque vous utilisez l'objet sacrificiel, l'objet sacrificiel sera transmis dans l'objet sacrificiel par le client. Il n'y a qu'un seul état externe ici, et l'état du paramètre de la méthode d'opération () est l'état externe passé de l'extérieur.
classe publique ConcreteFlyweight implémente Flyweight {Caractère privé IntrinsicState = null; / ** * Constructeur, l'état intrinsèque est passé sous forme de paramètre * @param état * / public ConcreteFlyweight (État de caractères) {this.intrinsicstate = state; } / ** * L'état externe est passé sous forme de paramètre dans la méthode, modifiant le comportement de la méthode, * mais ne modifiant pas l'état intrinsèque de l'objet. * / @Override public void Operation (String State) {// TODO Méthode générée automatique Stub System.out.println ("Intrinsic State =" + this.intrinsicState); System.out.println ("Extrinsic State =" + State); }}Pour la classe de rôles d'usine de Xiangyuan, il faut souligner que le client ne peut pas instancier directement la classe de Xiangyuan spécifique, mais doit utiliser une méthode d'usine () pour obtenir l'objet Xiangyuan. D'une manière générale, il n'y a qu'un seul objet d'usine Xiangyuan dans tout le système, donc le mode Singleton peut également être utilisé.
Lorsque le client a besoin d'un simple objet de plaisir, il doit appeler la méthode d'usine () de l'usine de plaisir et passer dans l'état interne requis de l'usine de plaisir, et la méthode d'usine génère l'objet de plaisir requis.
classe publique FlyweightFactory {Private Map <caractère, Flyweight> files = new HashMap <caractère, Flyweight> (); Factory de poids de mouche publique (État de caractère) {// Recherchez d'abord l'objet à partir du cache Flyweight Fly = Files.get (état); if (fly == null) {// Si l'objet n'existe pas, créez un nouvel objet Flyweight Fly = new ConcreteFlyweight (état); // Ajouter ce nouvel objet Flyweight à Cache Files.put (état, mouche); } return fly; }}Classe client
classe publique Client {public static void main (String [] args) {// TODO Méthode générée automatique Stub FlyweightFactory Factory = new FlyweightFactory (); Flyweight Fly = Factory.factory (nouveau caractère ('a')); Fly.Operation ("premier appel"); fly = factory.factory (nouveau caractère ('b')); Fly.Operation ("Second Call"); fly = factory.factory (nouveau caractère ('a')); Fly.Operation ("Troisième appel"); }}Bien que le client ait demandé trois objets sacrificiels, il n'y a que deux objets sacrificiels réellement créés, ce que signifie le partage. Les résultats de l'opération sont les suivants:
Mode de plaisir complexe
Dans le mode de plaisir simple, tous les objets de plaisir sont des objets de plaisir simples, ce qui signifie qu'ils peuvent être directement partagés. Il existe également une situation plus compliquée où un mode de synthèse d'utilisation extrinsèque simple est combiné pour former un objet extrinsèque composite. Ces objets Meta-enjoy composites ne peuvent pas être partagés par eux-mêmes, mais ils peuvent être décomposés en objets de méta-enjoy simples, et ces derniers peuvent être partagés.
Les personnages impliqués dans le personnage composé de Xiangyuan sont les suivants:
Rôle du poids de la mouche abstrait: donne une interface abstraite pour spécifier les méthodes que tous les rôles de poids mouche spécifiques doivent être mis en œuvre.
Rôle de poids en béton: implémente l'interface spécifiée par le rôle abstrait de Xiangyuan. S'il y a un état intrinsèque, vous devez être responsable de fournir un espace de stockage pour l'état intrinsèque.
CompositeCompositeFlyweight Role: Les objets représentés par la part des composés ne peuvent pas être partagés, mais un objet de partage composite peut être décomposé en plusieurs combinaisons d'objets qui sont simplement des objets partageant. Le rôle extrinsèque composé est également appelé objet extrinsèque non partagé.
FlyweightFactory Rôle: ce rôle est responsable de la création et de la gestion du rôle de Xiangyuan. Ce rôle doit garantir que l'objet de plaisir peut être correctement partagé par le système. Lorsqu'un objet client appelle un objet Xiangyuan, le rôle d'usine Xiangyuan vérifiera s'il existe déjà un objet Xiangyuan qui répond aux exigences du système. S'il existe déjà, le rôle d'usine de Xiangyuan devrait fournir l'objet Xiangyuan existant; S'il n'y a pas d'objet Xiangyuan approprié dans le système, le rôle d'usine Xiangyuan devrait créer un objet Xiangyuan approprié.
code source
Classe de caractères abstraite
Interface publique Flyweight {// Une méthode schématique, l'état du paramètre est l'état externe Opération de void public (état de chaîne);} Classe de rôle spécifique
classe publique ConcreteFlyweight implémente Flyweight {Caractère privé IntrinsicState = null; / ** * Constructeur, l'état intrinsèque est passé sous forme de paramètre * @param état * / public ConcreteFlyweight (État de caractères) {this.intrinsicstate = state; } / ** * L'état externe est passé sous forme de paramètre dans la méthode, modifiant le comportement de la méthode, * mais ne modifiant pas l'état intrinsèque de l'objet. * / @Override public void Operation (String State) {// TODO Méthode générée automatique Stub System.out.println ("Intrinsic State =" + this.intrinsicState); System.out.println ("Extrinsic State =" + State); }}L'objet extrinsèque composite est composé d'un objet extrinsèque pur par le composé, il fournit donc une méthode de gestion d'agrégation telle que Add (). Étant donné qu'un méta-objet composite a des éléments d'agrégats différents, ces éléments agrégés sont ajoutés après la création de l'objet Meta composite, cela signifie lui-même que l'état du méta composite Meta changera, de sorte que le méta-objet composite ne peut pas être partagé.
Le rôle extrinsèque composé implémente l'interface spécifiée par le rôle extrinsèque abstrait, c'est-à-dire la méthode Operation (). Cette méthode a un paramètre qui représente l'état externe de l'objet extrinsèque composite. Les états externes de tous les éléments d'un objet de jouissance composite sont égaux à l'état externe de l'objet de jouissance composite; Bien que les états internes de l'objet de jouissance simple contenu dans un objet de jouissance composite ne soient généralement pas égaux, sinon il n'y aura pas de valeur d'utilisation.
classe publique CONCRETECOMPOSITEFLYWEMPLE implémente Flyweight {Private Map <Caracter, Flyweight> Files = new HashMap <caractère, Flyweight> (); / ** * Ajoutez un nouvel objet de méta-économie simple au cluster * / public void add (touche de caractères, mouche à mouche) {files.put (key, fly); } / ** * L'état externe est transmis dans la méthode en tant que paramètre * / @Override public void Operation (String State) {Flyweight Fly = NULL; pour (objet o: files.keyset ()) {fly = files.get (o); Fly.Operation (État); }}} Le rôle d'usine de Xiangyuan fournit deux méthodes différentes, l'une pour fournir un objet Xiangyuan simple et l'autre pour fournir un objet Xiangyuan composite.
classe publique FlyweightFactory {Private Map <caractère, Flyweight> files = new HashMap <caractère, Flyweight> (); / ** * Méthode d'usine de XiangyUan composée * / Fumple de mouche publique (list <acteracter> ComposeState) {CONCRETECOMPOSITEFLY LEAUX COMPOSITEFLY = NOUVEAU CONCRETECOMPOSITEFLYWEMPEL (); for (State State: ComposeState) {CompositeFly.add (état, this.factory (état)); } return CompositeFly; } / ** * Méthode d'usine de l'Encyclopedia Simple * / Fumple de mouche publique (État de caractère) {// Recherchez d'abord l'objet de la Flyweight Cache Fly = Files.get (état); if (fly == null) {// Si l'objet n'existe pas, créez un nouvel objet Flyweight Fly = new ConcreteFlyweight (état); // Ajouter ce nouvel objet Flyweight à Cache Files.put (état, mouche); } return fly; }} Rôles clients
classe publique Client {public static void main (String [] args) {list <acteracter> CompositeState = new ArrayList <Comacacre> (); CompositeState.add ('A'); CompositeState.add ('B'); CompositeState.add ('C'); CompositeState.add ('A'); CompositeState.add ('B'); FlyweightFactory Flyfactory = new FlyweightFactory (); Flyweight CompositeFly1 = flyfactory.factory (ComposeState); Flyweight CompositeFly2 = flyfactory.factory (ComposeState); CompositeFly1.Operation ("Composite Call"); System.out.println ("----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Flyfactory.factory (état); System.out.println ("peut être partagé par le mode de méta-économie simple:" + (fly1 == Fly2));Les résultats de l'opération sont les suivants:
D'après les résultats de l'opération, on peut voir que l'état externe de tous les éléments d'un objet de jouissance composite est égal à l'état externe de l'objet de jouissance composite. C'est-à-dire que l'état de fortune externe est égal à l'appel composite.
D'après les résultats de l'opération, on peut voir que les états de connotation d'un objet existant simple contenu dans un objet composite existant sont généralement inégaux. C'est-à-dire que les états internes sont b, c et a.
D'après les résultats en cours d'exécution, on peut voir que l'objet de partage composite ne peut pas être partagé. C'est-à-dire que l'objet créé en utilisant le même objet compositeState via l'usine deux fois n'est pas le même objet.
D'après les résultats de l'opération, on peut voir que le simple fait de profiter de l'élément peut être partagé. C'est-à-dire que l'objet créé via l'usine deux fois en utilisant le même état d'objet est le même objet.
Avantages et inconvénients du modèle Xiangyuan
L'avantage du mode encyclopédie est qu'il réduit considérablement le nombre d'objets en mémoire. Cependant, le prix qu'il verse pour le faire est également très élevé:
Le mode encyclopédie rend le système plus complexe. Pour que les objets soient partagés, un état doit être externalisé, ce qui complique la logique du programme.
Le mode de profit externalise l'état de l'objet de profit, tandis que la lecture de l'état externe rend le temps d'exécution légèrement plus long.
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.