Progetto

Generale

Profilo

DesignPattern » Cronologia » Versione 2

Amministratore Truelite, 27-02-2007 12:18

1 1 Amministratore Truelite
== Flyweight Pattern ==
2
3
Il pattern flyweight viene utilizzato quando si ha a che fare con un gran numero di oggetti con alcune caratteristiche comuni (che variano raramente) ed altre non comuni di cui ogni oggetto si fa carico per se.
4
5
Questo pattern può essere molto utile quando si vuole alleggerire il carico in ram di un grande numero di oggetti, facendo in modo di riutilizzare oggetti con "lo stesso stato".
6
7
Ecco un esempio di codice:
8
{{{
9 2 Amministratore Truelite
# Flyweight pattern
10
# La classe "TipoOggetto" mantiene informazione delle caratteristiche intrinseche degli oggetti (in comune)
11 1 Amministratore Truelite
class TipoOggetto(object):
12
        _listaOggetti = {}
13
        
14
        def __new__(cls, name):
15
                oggetto = TipoOggetto._listaOggetti.get(name,None)
16
                
17
                if not oggetto:
18
                        oggetto = object.__new__(cls)
19
                        TipoOggetto._listaOggetti[name] = oggetto
20
                return oggetto
21
22
23
        def __init__(self, name):
24
                self.name = name
25
                print id(self), name
26 2 Amministratore Truelite
27
# Per mostrare come un oggetto può avere delle caratteristiche estrinseche si deve creare
28
# un'altra classe che utilizzi due oggetti di cui uno di tipo "TipoOggetto"
29
30
class ProvaFlyweight:
31 1 Amministratore Truelite
        
32 2 Amministratore Truelite
        def __init__(self, name, altro):
33
                self.name = TipoOggetto(name)
34
                self.altro = altro
35 1 Amministratore Truelite
36 2 Amministratore Truelite
37
a = ProvaFlyweight("obj1", "1")
38
b = ProvaFlyweight("obj2", "2")
39
c = ProvaFlyweight("obj3", "3")
40
d = ProvaFlyweight("obj1", "4")
41
42
print id(a.name)
43
print id(b.name)
44
print id(c.name)
45
print id(d.name)
46
47
48
print id(a.altro)
49
print id(b.altro)
50
print id(c.altro)
51
print id(d.altro)
52
53 1 Amministratore Truelite
}}}
54
-1210981812 obj1
55
56
-1210981780 obj2
57
58
-1210981812 obj1
59
60
Come si può vedere dal risultato dell'esecuzione il primo ed il terzo oggetto sono "un solo oggetto".