Progetto

Generale

Profilo

DesignPattern » Cronologia » Versione 5

Versione 4 (Amministratore Truelite, 27-02-2007 12:20) → Versione 5/9 (Amministratore Truelite, 27-02-2007 12:44)

== Singleton Pattern == 
 Il pattern singleton viene utilizzato quando si vuole creare una sola instanza di una classe.  

 Proviamo a pensare al caso di parsing di dati; essendo questa una operazione lunga e dispendiosa in termini di calcolo vogliamo poter riutilizzare i risultati della prima "esecuzione". 

 Ecco un esempio: 
 {{{ 
 # Singleton class 
 # If instance is null creates an instance calling __new__ from object 
 class Singleton(object): 
         instance = None 
                
         def __new__(cls): 
                 if cls.instance == None: 
                         cls.instance = super(Singleton, cls).__new__(cls) 
                 return cls.instance 

 a = Singleton() 

 print type(a) 
 print id(a) 


 b = Singleton() 
 print type(b) 
 print id(b) 
 }}} 

 Risultato esecuzione: 

 <class '__main__.Singleton'>  

 -1211002548 

 <class '__main__.Singleton'> 

 -1211002548 


 == Flyweight Pattern == 

 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. 

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

 Ecco un esempio di codice: 
 {{{ 
 # Flyweight pattern 
 # La classe "TipoOggetto" mantiene informazione delle caratteristiche intrinseche degli oggetti (in comune) 
 class TipoOggetto(object): 
         _listaOggetti = {} 
        
         def __new__(cls, name): 
                 oggetto = TipoOggetto._listaOggetti.get(name,None) 
                
                 if not oggetto: 
                         oggetto = object.__new__(cls) 
                         TipoOggetto._listaOggetti[name] = oggetto 
                 return oggetto 


         def __init__(self, name): 
                 self.name = name 
                 print id(self), name 

 # Per mostrare come un oggetto può avere delle caratteristiche estrinseche si deve creare 
 # un'altra classe che utilizzi due oggetti di cui uno di tipo "TipoOggetto" 

 class ProvaFlyweight: 
        
         def __init__(self, name, altro): 
                 self.name = TipoOggetto(name) 
                 self.altro = altro 


 a = ProvaFlyweight("obj1", "1") 
 b = ProvaFlyweight("obj2", "2") 
 c = ProvaFlyweight("obj3", "3") 
 d = ProvaFlyweight("obj1", "4") 

 print id(a.name) 
 print id(b.name) 
 print id(c.name) 
 print id(d.name) 


 print id(a.altro) 
 print id(b.altro) 
 print id(c.altro) 
 print id(d.altro) 

 }}} 
 -1210465204 obj1 

 -1210465140 obj2 

 -1210465076 obj3 

 -1210465204 obj1 

 -1210465204 

 -1210465140 

 -1210465076 

 -1210465204 

 -1210102464 

 -1210465600 

 -1210465536 

 -1210465440 

 Come si può vedere dal risultato dell'esecuzione l'attributo "name" dell'instanza "a" e "d" sono un unico oggetto.