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. |