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