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