** Inhaltsverzeichnis ** Es gibt verschiedene schwierige Dinge im Buch, aber kurz gesagt, das mehrfache Erstellen desselben Objekts ist in vielerlei Hinsicht teuer. Erstellen Sie daher eine Factory-Klasse und erstellen Sie eine Instanz nur einmal. Vermeiden wir es. Das ist der Zweck dieses Musters.
Verwenden Sie die Freigabe, um eine große Anzahl kleiner Objekte effizient zu unterstützen.
-Flyweight Abstrakte Objektklasse, die eine große Anzahl identischer Instanzen generieren muss ・ Betonfliegengewicht Fliegengewichtsbetonklasse -Klasse, die die UnsharedConcreteFlyweight Flyweight-Klasse verwaltet Klasse, die die Flyweight-Klasse als untergeordnetes Element enthält, z. B. Zeilen und Spalten -FlyweightFactory-Klasse, die die Flyweight-Klasse generiert ・ Client-Benutzer
Zeichenklasse Klasse, die ein Zeichen verwaltet
Character.kt
package flyweight
class Character(private val character: Char) {
fun print() {
print(character)
}
}
Charakterherstellungsklasse Erstellen Sie eine Factory-Klasse, die eine Instanz der Zeichenklasse erstellt und zusammenfasst. Durch Zusammenführen der Objekte, die einmal in der Klasse erstellt wurden, werden die zuvor erstellten Objekte nicht erneut erstellt.
CharacterFactory.kt
package flyweight
//Machen Sie es zu einem Singleton-Objekt
object CharacterFactory {
val characterPool = HashMap<AllCharacter, Character>()
enum class AllCharacter(val value: Char) {
A('A'),
B('B'),
C('C'),
D('D'),
E('E'),
F('F'),
G('G'),
H('H'),
I('I'),
J('J'),
K('K'),
L('L'),
M('M'),
N('N'),
O('O'),
P('P'),
Q('Q'),
R('R'),
S('S'),
T('T'),
U('U'),
V('V'),
W('W'),
X('X'),
Y('Y'),
Z('Z')
}
fun getCharacterObject(characterType: AllCharacter): Character {
//Wenn nicht generiert, bündeln Sie die Instanz.
characterPool[characterType]?.let {
return it
} ?: run {
val char = Character(characterType.value)
characterPool[characterType] = char
return char
}
}
}
Leute, die Buchstaben benutzen BANANE generieren.
Client.kt
package flyweight
class Client {
init {
val characters = ArrayList<Character>()
// "BANANA"Generieren
characters.add(CharacterFactory.getCharacterObject(CharacterFactory.AllCharacter.B))
characters.add(CharacterFactory.getCharacterObject(CharacterFactory.AllCharacter.A))
characters.add(CharacterFactory.getCharacterObject(CharacterFactory.AllCharacter.N))
characters.add(CharacterFactory.getCharacterObject(CharacterFactory.AllCharacter.A))
characters.add(CharacterFactory.getCharacterObject(CharacterFactory.AllCharacter.N))
characters.add(CharacterFactory.getCharacterObject(CharacterFactory.AllCharacter.A))
characters.forEach {
it.print()
}
}
}
[output]
BANANA
Recommended Posts