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

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

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

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

抽象工厂模式(python版)的更多相关文章

  1. 大话设计模式C++版——抽象工厂模式

    前面说过,简单工厂模式是最基础的一种设计模式,那以工厂命名的设计模式就是23种设计模式中最多的一种,他们一脉相承,一步一步进化而来,这里就是其中的最后一种——抽象工厂模式(Abstract Facto ...

  2. 抽象工厂模式(Java与Kotlin版)

    前文推送 设计模式 简单工厂模式(Java与Kotlin版) 工厂方法模式(Java与Kotlin版) Kotlin基础知识 Kotlin入门第一课:从对比Java开始 Kotlin入门第二课:集合操 ...

  3. python风格的抽象工厂模式

    抽象工厂模式: 提供一个接口,用户创建多个相关或依赖对象,而不需要指定具体类. 原则: 依赖抽象,不依赖具体类. 实例: 用不同原材料制作不同口味的披萨,创建不同原材料的工厂,不同实体店做出口味不同的 ...

  4. 设计模式(Python)-简单工厂,工厂方法和抽象工厂模式

    本系列文章是希望将软件项目中最常见的设计模式用通俗易懂的语言来讲解清楚,并通过Python来实现,每个设计模式都是围绕如下三个问题: 为什么?即为什么要使用这个设计模式,在使用这个模式之前存在什么样的 ...

  5. [Python编程实战] 第一章 python的创建型设计模式1.1抽象工厂模式

    注:关乎对象的创建方式的设计模式就是“创建型设计模式”(creational design pattern) 1.1 抽象工厂模式 “抽象工厂模式”(Abstract Factory Pattern) ...

  6. 大话设计模式Python实现- 抽象工厂模式

    抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的类 下面是一个抽象工厂的demo: #!/usr/bin/env pyth ...

  7. 浅谈Python设计模式 - 抽象工厂模式

    声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 在上一篇我们对工厂模式中的普通工厂模式有了一定的了解,其实抽象工作就是 表示针对 ...

  8. python 设计模式之工厂模式 Factory Pattern (简单工厂模式,工厂方法模式,抽象工厂模式)

    十一回了趟老家,十一前工作一大堆忙成了狗,十一回来后又积累了一大堆又 忙成了狗,今天刚好抽了一点空开始写工厂方法模式 我看了<Head First 设计模式>P109--P133 这25页 ...

  9. [Python设计模式] 第15章 如何兼容各种DB——抽象工厂模式

    github地址:https://github.com/cheesezh/python_design_patterns 题目 如何让一个程序,可以灵活替换数据库? 基础版本 class User(): ...

随机推荐

  1. Javasript中Date日期常用用法(正则、比较)

    Date 对象用于处理日期和时间.创建 Date 对象的语法:  代码如下 复制代码 var myDate=new Date() Date 对象会自动把当前日期和时间保存为其初始值.参数形式有以下5种 ...

  2. 【转载】应广大群众的要求,今天开始连载《超容易的Linux系统管理入门书》一书

    学习Linux容易嘛?我说超容易,你肯定不信.那学习Linux最好的学习方法是什么,就是脑子里面一直提问题,不停的提,时时刻刻提,如果你没有问题,那再容易的学习书你也看不懂. <超容易的Linu ...

  3. 一种好的持久层开发方法——建立BaseDao和BaseDaoImpl

    使用hibernate开发持久层时,我们会发现:虽然entity类的含义和需求不同,其对应的Dao层类对应的方法也是不同的.但是有许多方法操作确实相同的.比如实体的增加,删除,修改更新,以及许多常用的 ...

  4. Contiki系统介绍

    本文内容来源为contiki英文介绍,自己为了学习,将其大致翻译成中文,以便了解. 欢迎转载,转载请注明来源,如果有什么翻译不合适的地方,请留言指出,相互交流学习. 介绍 Contiki是一个开放源码 ...

  5. memset与NULL区别

    memset与NULL区别 NULL与0 的区别 为什么强调一个malloc对应一个free 在一个结构体malloc,然后free,但是她的成员变量的malloc并没有free,还需要特别的free ...

  6. map容器按value值排序

    1 vector<pair<key,value> >类型的容器中存放所有元素,sort(pair默认按照value比较大小?) 2 map<value,key>

  7. SQL 存储过程加事务的使用

    create proc USP_CUTTING_TATABLET_PULL_FINISH ( @name NVARCHAR(20) ) as SET XACT_ABORT ON--设置全盘回滚 BEG ...

  8. 关于C#正则表达式MatchCollection类的总结,正则表达式的应用

    认识MatchCollection 类 表示通过以迭代方式将正则表达式模式应用于输入字符串所找到的成功匹配的集合. 命名空间:  System.Text.RegularExpressions 属性:C ...

  9. c#的协变和逆变

    关于协变和逆变要从面向对象继承说起.继承关系是指子类和父类之间的关系:子类从父类继承,所以子类的实例也就是父类的实例.比如说Animal是父类,Dog是从Animal继承的子类:如果一个对象的类型是D ...

  10. c++,C# 转换

    //C++中的DLL函数原型为        //extern "C" __declspec(dllexport) bool 方法名一(const char* 变量名1, unsi ...