抽象工厂模式(python版)

http://blog.csdn.net/ponder008/article/details/6886039

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

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

[python] view plaincopy
 
    1. #encoding=utf-8  
    2. #  
    3. #by panda  
    4. #抽象工厂模式  
    5.   
    6.   
    7. def printInfo(info):  
    8.     print unicode(info, 'utf-8').encode('gbk')  
    9.       
    10. #抽象产品A:user表  
    11. class IUser():  
    12.     def Insert(self):  
    13.         pass  
    14.     def GetUser(self):  
    15.         pass  
    16.   
    17. #sqlserver实现的User  
    18. class SqlserverUser(IUser):  
    19.     def Insert(self):  
    20.         printInfo("在SQL Server中给User表增加一条记录")  
    21.     def GetUser(self):  
    22.         printInfo("在SQL Server中得到User表的一条记录")  
    23.   
    24. #Access实现的User  
    25. class AccessUser(IUser):  
    26.     def Insert(self):  
    27.         printInfo("在Access中给User表增加一条记录")  
    28.     def GetUser(self):  
    29.         printInfo("在Access中得到User表一条记录")  
    30.   
    31.   
    32. #抽象产品B:部门表  
    33. class IDepartment():  
    34.     def Insert(self):  
    35.         pass  
    36.     def GetUser(self):  
    37.         pass  
    38.   
    39. #sqlserver实现的Department  
    40. class SqlserverDepartment(IUser):  
    41.     def Insert(self):  
    42.         printInfo("在SQL Server中给Department表增加一条记录")  
    43.     def GetUser(self):  
    44.         printInfo("在SQL Server中得到Department表的一条记录")  
    45.   
    46. #Access实现的Department  
    47. class AccessDepartment(IUser):  
    48.     def Insert(self):  
    49.         printInfo("在Access中给Department表增加一条记录")  
    50.     def GetUser(self):  
    51.         printInfo("在Access中得到Department表一条记录")  
    52.   
    53.   
    54. #抽象工厂  
    55. class IFactory():  
    56.     def CreateUser(self):  
    57.         pass  
    58.     def CreateDepartment(self):  
    59.         pass      
    60.   
    61. #sql server工厂  
    62. class SqlServerFactory(IFactory):  
    63.     def CreateUser(self):  
    64.         return SqlserverUser()  
    65.     def CreateDepartment(self):  
    66.         return SqlserverDepartment()  
    67.   
    68. #access工厂  
    69. class AccessFactory(IFactory):  
    70.     def CreateUser(self):  
    71.         return AccessUser()  
    72.     def CreateDepartment(self):  
    73.         return AccessDepartment()  
    74.       
    75. #优化一:采用一个简单工厂类,封装逻辑判断操作  
    76. class DataAccess():  
    77. #    db = "Sqlserver"  
    78.     db = "Access"  
    79.     @staticmethod  
    80.     def CreateUser():  
    81.         if (DataAccess.db == "Sqlserver"):  
    82.             return SqlserverUser()  
    83.         elif(DataAccess.db == "Access"):  
    84.             return AccessUser()  
    85.     @staticmethod  
    86.     def CreateDepartment():  
    87.         if (DataAccess.db == "Sqlserver"):  
    88.             return SqlserverDepartment()  
    89.         elif(DataAccess.db == "Access"):  
    90.             return AccessDepartment()  
    91.           
    92. #优化二:采用反射机制,避免使用太多判断  
    93. ##以下信息可以从配置文件中获取  
    94. DBType = 'Sqlserver' #'Access'  
    95. DBTab_User = 'User'  
    96. DBTab_Department = 'Department'  
    97.   
    98. class DataAccessPro():  
    99. #    db = "Sqlserver"  
    100.     db = "Access"  
    101.     @staticmethod  
    102.     def CreateUser():  
    103.         funName = DBType + DBTab_User  
    104.         return eval(funName)()  #eval 将其中的字符串转化为python表达式  
    105.     @staticmethod  
    106.     def CreateDepartment():  
    107.         funName = DBType + DBTab_Department  
    108.         return eval(funName)()  
    109.           
    110. def clientUI():  
    111.     printInfo(" --------抽象工厂方法--------")  
    112.     factory = SqlServerFactory()  
    113.     iu = factory.CreateUser()  
    114.     iu.Insert()  
    115.     iu.GetUser()  
    116.     id = factory.CreateDepartment()  
    117.     id.Insert()  
    118.     id.GetUser()  
    119.       
    120.     printInfo(" --抽象工厂方法+简单工厂方法--")  
    121.     iu = DataAccess.CreateUser()  
    122.     iu.Insert()  
    123.     iu.GetUser()  
    124.     id = DataAccess.CreateDepartment()  
    125.     id.Insert()  
    126.     id.GetUser()  
    127.       
    128.     printInfo(" -抽象工厂方法+简单工厂方法+反射-")  
    129.     iu = DataAccessPro.CreateUser()  
    130.     iu.Insert()  
    131.     iu.GetUser()  
    132.     id = DataAccessPro.CreateDepartment()  
    133.     id.Insert()  
    134.     id.GetUser()      
    135.     return  
    136.   
    137.   
    138. if __name__ == '__main__':  
    139.     clientUI();  
原文地址:https://www.cnblogs.com/DjangoBlog/p/3529959.html