抽象工厂模式(python版)


抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
优点:易于交换“产品系列”,只要更改相应的工厂即可。
缺点:建立产品的时候很繁琐,需要增加和修改很多东西。

优化1:为了避免客户端有过多的逻辑判断,可以封装出一个简单工厂类来生成产品类。
优化2:为了减少简单工厂类里面的逻辑判断,可以采用“反射”机制,直接根据外部的配置文件读取出需要使用产品类的信息。

 
#encoding=utf-8 

#by panda 
#抽象工厂模式 
 
 
def printInfo(info): 
    print unicode(info, 'utf-8').encode('gbk') 
     
#抽象产品A:user表 
class IUser(): 
    def Insert(self): 
        pass 
    def GetUser(self): 
        pass 
 
#sqlserver实现的User 
class SqlserverUser(IUser): 
    def Insert(self): 
        printInfo("在SQL Server中给User表增加一条记录") 
    def GetUser(self): 
        printInfo("在SQL Server中得到User表的一条记录") 
 
#Access实现的User 
class AccessUser(IUser): 
    def Insert(self): 
        printInfo("在Access中给User表增加一条记录") 
    def GetUser(self): 
        printInfo("在Access中得到User表一条记录") 
 
 
#抽象产品B:部门表 
class IDepartment(): 
    def Insert(self): 
        pass 
    def GetUser(self): 
        pass 
 
#sqlserver实现的Department 
class SqlserverDepartment(IUser): 
    def Insert(self): 
        printInfo("在SQL Server中给Department表增加一条记录") 
    def GetUser(self): 
        printInfo("在SQL Server中得到Department表的一条记录") 
 
#Access实现的Department 
class AccessDepartment(IUser): 
    def Insert(self): 
        printInfo("在Access中给Department表增加一条记录") 
    def GetUser(self): 
        printInfo("在Access中得到Department表一条记录") 
 
 
#抽象工厂 
class IFactory(): 
    def CreateUser(self): 
        pass 
    def CreateDepartment(self): 
        pass     
 
#sql server工厂 
class SqlServerFactory(IFactory): 
    def CreateUser(self): 
        return SqlserverUser() 
    def CreateDepartment(self): 
        return SqlserverDepartment() 
 
#access工厂 
class AccessFactory(IFactory): 
    def CreateUser(self): 
        return AccessUser() 
    def CreateDepartment(self): 
        return AccessDepartment() 
     
#优化一:采用一个简单工厂类,封装逻辑判断操作 
class DataAccess(): 
#    db = "Sqlserver" 
    db = "Access" 
    @staticmethod 
    def CreateUser(): 
        if (DataAccess.db == "Sqlserver"): 
            return SqlserverUser() 
        elif(DataAccess.db == "Access"): 
            return AccessUser() 
    @staticmethod 
    def CreateDepartment(): 
        if (DataAccess.db == "Sqlserver"): 
            return SqlserverDepartment() 
        elif(DataAccess.db == "Access"): 
            return AccessDepartment() 
         
#优化二:采用反射机制,避免使用太多判断 
##以下信息可以从配置文件中获取 
DBType = 'Sqlserver' #'Access' 
DBTab_User = 'User' 
DBTab_Department = 'Department' 
 
class DataAccessPro(): 
#    db = "Sqlserver" 
    db = "Access" 
    @staticmethod 
    def CreateUser(): 
        funName = DBType + DBTab_User 
        return eval(funName)()  #eval 将其中的字符串转化为python表达式 
    @staticmethod 
    def CreateDepartment(): 
        funName = DBType + DBTab_Department 
        return eval(funName)() 
         
def clientUI(): 
    printInfo("\n--------抽象工厂方法--------") 
    factory = SqlServerFactory() 
    iu = factory.CreateUser() 
    iu.Insert() 
    iu.GetUser() 
    id = factory.CreateDepartment() 
    id.Insert() 
    id.GetUser() 
     
    printInfo("\n--抽象工厂方法+简单工厂方法--") 
    iu = DataAccess.CreateUser() 
    iu.Insert() 
    iu.GetUser() 
    id = DataAccess.CreateDepartment() 
    id.Insert() 
    id.GetUser() 
     
    printInfo("\n-抽象工厂方法+简单工厂方法+反射-") 
    iu = DataAccessPro.CreateUser() 
    iu.Insert() 
    iu.GetUser() 
    id = DataAccessPro.CreateDepartment() 
    id.Insert() 
    id.GetUser()     
    return 
 
 
if __name__ == '__main__': 
    clientUI(); 


类图:


\

 

摘自:ponder008的专栏

相关内容

    暂无相关文章

评论关闭