• 抽象工厂模式(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();  
  • 相关阅读:
    Dragonfly 基于 P2P 的文件和镜像分发系统
    一文搞懂 SAE 日志采集架构
    携手共建云原生生态 阿里云云原生加速器第二次集结圆满结营
    开放下载 | 飞天技术峰会云原生加速应用构建分论坛资料开放下载
    使用函数计算自定义运行时快速部署一个 SpringBoot 项目 | 文末有礼
    阿里云容器服务 ACK 产品技术动态(202207)
    阿里云 ACK One 多集群管理全面升级:多集群服务、多集群监控、两地三中心应用容灾
    掌握软件开发技术的第一性原理2
    掌握软件开发技术的第一性原理1
    library
  • 原文地址:https://www.cnblogs.com/DjangoBlog/p/3529959.html
Copyright © 2020-2023  润新知