Progetto

Generale

Profilo

DesignPattern » Cronologia » Versione 4

Amministratore Truelite, 27-02-2007 12:20

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 3 Amministratore Truelite
-1210465204 obj1
55 1 Amministratore Truelite
56 3 Amministratore Truelite
-1210465140 obj2
57 1 Amministratore Truelite
58 3 Amministratore Truelite
-1210465076 obj3
59
60
-1210465204 obj1
61
62
-1210465204
63
64
-1210465140
65
66
-1210465076
67
68
-1210465204
69
70
-1210102464
71
72
-1210465600
73
74
-1210465536
75
76
-1210465440
77 1 Amministratore Truelite
78 4 Amministratore Truelite
Come si può vedere dal risultato dell'esecuzione l'attributo "name" dell'instanza "a" e "d" sono un unico oggetto.