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. 【ROW_NUMBER 函数(Transact-SQL)】

    [ROW_NUMBER 函数(Transact-SQL)]返回结果集分区内行的序列号,每个分区的第一行从 1 开始. 注释: ROW_NUMBER() OVER (PARTITION BY COL1 ...

  2. 理解CPU内存管理

    概述:从设计层面理解CPU的内存模式,包括段式内存管理.页式内存管理以及虚拟化扩展内存管理.实际上,硬件支持与软件实现从来就不是能分开讲的,比如,Intel CPU架构师在选择CPU的硬件特性时,必然 ...

  3. Linux下c函数dlopen实现加载动态库so文件代码举例

    dlopen()是一个强大的库函数.该函数将打开一个新库,并把它装入内存.该函数主要用来加载库中的符号,这些符号在编译的时候是不知道的.这种机制使得在系统中添加或者删除一个模块时,都不需要重新编译了. ...

  4. HTML中的<select>标签如何设置默认选中的选项

    方法有两种. 第一种通过<select>的属性来设置选中项,此方法可以在动态语言如php在后台根据需要控制输出结果. 1 2 3 4 5 < select  id =  " ...

  5. mvc Web api 如何在控制器中调用

    关于如何调用 mvc Web api 的方法,网上一搜就是一大把,基本都是在前台jq中调用的,但是如何在后台调用呢? 本楼主做了一下测试,仅供参考. 先写一个简单的api,如下:[域1] namesp ...

  6. Win32非递归遍历和搜索文件以及目录算法

    转载请注明来源:http://www.cnblogs.com/xuesongshu 要点: 1.搜索的顶层目录在进入循环之前进栈 2.栈元素存储字符串指针,出栈时释放资源 3.每次循环开始,栈顶元素出 ...

  7. Cocos2d-x实例:设置背景音乐与音效- AppDelegate实现

    为了进一步了解背景音乐和音效播放的,我们通过一个实例给大家介绍一下.如下图所示有两个场景:HelloWorld和Setting.在HelloWorld场景点击“游戏设置”菜单可以切换到Setting场 ...

  8. Cocos2d-x中背景音乐播放暂停与继续

    背景音乐播放暂停与继续似乎我们很少使用,事实上也正是如此,背景音乐播放暂停与继续实例代码如下: SimpleAudioEngine::getInstance()->pauseBackground ...

  9. NSUserDefaults存储自定义对象

    场景是这样的: 现在有一个数组如下,数组中存放着自定义的对象GoodscCategory <__NSArrayM 0x7ffb9c2032b0>( <GoodscCategory: ...

  10. [Bootstrap]概述

    ——1.html,css,javascript框架                ——2.一般开发响应式布局或者移动优先的项目可以优先考虑 优点 1.css开发版本(可以直接上手)和源码版本(可根据l ...