Flyweight Pattern Wiederverwendung ohne mehrere Instanzen, um speicherfreundlich zu sein
Diese Seite beschreibt Folgendes ・ Grundkonfiguration des Fliegengewichts ·Implementierung
Klasse | Erläuterung |
---|---|
factory.class | sam.Duplizieren Sie keine Klasseninstanzen |
sam.class | Zielklasse, für die der Benutzer eine Instanz erstellt |
user(Main.class) | factory.Sam über Klasse.Erstellen Sie eine Klasseninstanz |
Grundstruktur von factory.class und sam.class
factory.class
class factory{
Map map;
sam getSam(){}
}
Im Werk wird die generierte sam () -Instanz in Map gespeichert Verwalten, um Doppelarbeit zu vermeiden
sam.class
class sam{
String s;
sam(){}
}
sam () registriert String s im Konstruktor
Implementieren Sie die folgende Grundstruktur
factory.class
class factory{
Map map = new HashMap(); // sam()Speichern Sie die Instanz
sam getSam(String key){
sam s = (sam) map.get(key); //Holen Sie sich eine Instanz von der Karte
if(s != null){return s;} //Wenn sich eine Instanz in der Karte befindet, übergeben Sie sie an den Benutzer
sam sm= new sam(key); //Wenn die Karte keine Instanz enthält, erstellen Sie eine Instanz
map.put(key,sm); //Registrieren Sie eine neue Instanz in der Karte, nachdem Sie sie erstellt haben
return sm; //Veröffentlichen Sie eine Instanz für den Benutzer
}
}
sam.class
class sam{
String s;
sam(String s){}
}
Es liegt ein Problem mit dem obigen Code vor. Die Factory verfügt über eine Map und verwaltet die sam () -Instanz. Wenn die Fabrik selbst zu mehreren Schnittstellen gemacht wird, werden durch diese Nummer unterschiedliche Karten erstellt.
Dann können Sie sam () -Instanzen nicht richtig verwalten Setzen wir also factory.class auf singleton (Es kann die Vervielfältigung von Map selbst nicht verhindern, aber vorerst als Prozess)
Implementieren Sie auch eine print () -Methode, die den Karteninhalt zur weiteren Überprüfung druckt
factory.class
class factory{Map map = new HashMap();
private static final factory fac = new factory();
private factory(){}
static factory getInstance(){
return fac;
}
sam getSam(String key){
sam s = (sam) map.get(key);
if( s != null){return s;}
sam sm = new sam(key);
map.put(key,sm);
return sm;
}
void print(){
Iterator it = map.keySet().iterator();
while(it.hasNext()){
sam s = (sam) map.get(it.next());
System.out.println(s+":"+s.get());
}
}
}
sam.class
class sam{
private String s;
sam(String s){this.s=s;}
String get(){return this.s;}
}
user(Main.class)
public static void main(String[] args){
factory f = factory.getInstance();
f.getSam("a");
f.getSam("b");
f.getSam("c");
f.getSam("a");
f.print();
}}
Recommended Posts