Pesi mosca
Pesi Mosca (mosca Pattern) è utilizzato principalmente per ridurre il numero di oggetti creati per ridurre l'utilizzo della memoria e migliorare le prestazioni. Questo tipo di modelli di progettazione appartengono modello strutturale, che prevede una riduzione del numero di oggetti da migliorare la struttura dell'oggetto in modo richiesto dall'applicazione.
Mosca cercare di riutilizzare gli oggetti esistenti dello stesso, se l'oggetto corrispondente non viene trovato, viene creato un nuovo oggetto. Noi disegnare 20 cerchi distribuiti in luoghi diversi con la creazione di cinque oggetti per dimostrare questo modello. Dal momento che solo cinque generi di colori disponibili, così l'attributo di colore viene utilizzato per controllare un oggettoCircleesistente.
introduzione
Intento: Utilizzare la condivisione per supportare un gran numero di oggetti a grana fine.
Principalmente per risolvere: In un gran numero di oggetti, può causare overflow di memoria, abbiamo messo insieme una porzione in cui l'abstract, se avete la stessa richiesta di servizio direttamente indietro gli oggetti esistenti in memoria, per evitare di ri-creato.
Quando utilizzare: 1, il sistema ha un gran numero di oggetti.2, questi oggetti consumano molta memoria. 3, lo stato della maggior parte di questi oggetti possono essere esteriorizzato. 4, un sacco di questi oggetti possono essere suddivisi in gruppi a seconda dello stato intrinseca, quando l'oggetto viene rimosso dagli oggetti esterni Yun, ogni oggetto può essere impostato utilizzando un oggetto, invece. 5, il sistema non dipende l'identità di questi oggetti, questi oggetti sono indistinguibili.
Come risolvere: Analizzando con un codice di identificazione univoco, se non vi è in memoria, viene restituito il codice unico di identificazione degli oggetti identificati.
La chiave codice: HashMap memorizzato con questi oggetti.
Esempi di applicazione: 1, JAVA nella stringa, se restituisce, se non poi creare una stringa memorizzata nel pool di buffer di stringa all'interno.2, il database pool di dati.
Vantaggi: riducono notevolmente la creazione di oggetti, riducendo la memoria del sistema, in modo che l'efficienza è migliorata.
Svantaggi: aumento responsabile del sistema, dobbiamo separare lo stato stato interno ed esterno, e lo stato esterno di natura sono intrinsecamente non dovrebbe cambiare con lo stato interno di cambiamento, altrimenti si creerà sistema caos.
scenari di utilizzo: 1, il sistema ha un gran numero di oggetti simili.2, hanno bisogno di piscina.
Nota: 1, prestare attenzione allo stato della divisione interna ed esterna dello Stato, o può causare problemi di thread-sicurezza.2, la classe deve avere un oggetto predefinito da controllare.
realizzazione
Creeremo una interfacciaformae l'implementazione dell'interfacciafigura del cerchioclassi di entità. Il passo successivo è quello di definire le classi di fabbricaShapeFactory.
ShapeFactoryavere uncerchiodiHashMap,dove ilcerchiodi colore chiave denominata oggetto. Ogni volta che si riceve una richiesta, si creerà un cerchio di colore specifica.ShapeFactoryverificarnel'HashMapnell'oggetto cerchio, se gli oggettiCircletrovato, viene restituito l'oggetto, altrimenti si creerà un immagazzinate nella HashMap per preparare il successivo utilizzo del nuovo oggetto, e l'oggetto viene restituito al client.
FlyWeightPatternDemo,la nostra demo per arrivare classe da utilizzare oggettoShapeShapeFactory. Sarà la trasmissione di informazioni(rosso / verde / blu / nero/ bianco) perShapeFactory,ha bisogno di ottenere il colore dell'oggetto.
fase 1
Creare un'interfaccia.
Shape.java
Forma interfaccia pubblica { void draw (); }
fase 2
Creare classe di entità che implementa l'interfaccia.
Circle.java
public class Circle implementa Shape { colore String privato; private int x; int y privato; int raggio privato; Circle pubblico (colore String) { this.colore = colore; } setX public void (int x) { this.x = x; } Sety public void (int y) { this.y = y; } setRadius public void (int radius) { this.radius = raggio; } @Override draw public void () { System.out.println ( "Circle: Draw () [Colore:" + colore + ", X:" + x + ", y" + y + ", radius:" + raggio); } }
fase 3
Creare una fabbrica per produrre le classi oggetto entità basate sulle informazioni fornite.
ShapeFactory.java
import java.util.HashMap; public class ShapeFactory { HashMap finale private static <String, Forma> circleMap = new HashMap (); Forma getCircle public static (colore String) { cerchio cerchio = (cerchio) circleMap.get (colore); if (cerchio == null) { cerchio = new Circle (colore); circleMap.put (colore, cerchio); System.out.println ( "Creazione di cerchio di colore:" + colore); } tornare cerchio; } }
fase 4
Utilizzare la fabbrica per ottenere un oggetto entità della classe passando le informazioni di colore.
FlyweightPatternDemo.java
public class FlyweightPatternDemo { colori private static final String [] = { "Rosso", "Verde", "Blue", "bianco", "Nero"}; Main (string [] args) {public static void for (int i = 0; i <20; ++ i) { cerchio cerchio = (Circle) ShapeFactory.getCircle (getRandomColor ()); circle.setX (getRandomX ()); circle.setY (getRandomY ()); circle.setRadius (100); circle.draw (); } } String private static getRandomColor () { ritorno colori [(int) (Math.random () * colors.length)]; } private static int getRandomX () { ritorno (int) (Math.random () * 100); } private static int getRandomY () { ritorno (int) (Math.random () * 100); } }
fase 5
Verifica uscita.
Creazione di cerchio di colore: Nero Circle: Draw () [Colore: Nero, x: 36, y: 71, Raggio: 100 Creazione di cerchio di colore: verde Circle: Draw () [Colore: Verde, x: 27, y: 27 Raggio: 100 Creazione di cerchio di colore: Bianco Circle: Draw () [Colore: Bianco, x: 64, y: 10, Raggio: 100 Creazione di cerchio di colore: rosso Circle: Draw () [Colore: Rosso, x: 15, y: 44, Raggio: 100 Circle: Draw () [Colore: Verde, x: 19, y: 10, Raggio: 100 Circle: Draw () [Colore: Verde, x: 94, y: 32, Raggio: 100 Circle: Draw () [Colore: Bianco, x: 69, y: 98, Raggio: 100 Creazione di cerchio di colore: blu Circle: Draw () [Colore: Blu, x: 13, y: 4, Raggio: 100 Circle: Draw () [Colore: Verde, x: 21, y: 21, Raggio: 100 Circle: Draw () [Colore: Blu, x: 55, y: 86, Raggio: 100 Circle: Draw () [Colore: Bianco, x: 90, y: 70, Raggio: 100 Circle: Draw () [Colore: Verde, x: 78, y: 3, Raggio: 100 Circle: Draw () [Colore: Verde, x: 64, y: 89, Raggio: 100 Circle: Draw () [Colore: Blu, x: 3, y: 91, Raggio: 100 Circle: Draw () [Colore: Blu, x: 62, y: 82, Raggio: 100 Circle: Draw () [Colore: Verde, x: 97, y: 61, Raggio: 100 Circle: Draw () [Colore: Verde, x: 86, y: 12, Raggio: 100 Circle: Draw () [Colore: Verde, x: 38, y: 93, Raggio: 100 Circle: Draw () [Colore: Rosso, x: 76, y: 82, Raggio: 100 Circle: Draw () [Colore: Blu, x: 95, y: 82, Raggio: 100