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. 给 Android 初学者的 Gradle 知识普及

    给 Android 初学者的 Gradle 知识普及:http://gold.xitu.io/entry/5778f8bd165abd0054b443b0/promote?utm_source=bai ...

  2. JDBC(用Eclipse操作数据库Oracle)的基础操作集合

    JDBC: JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编 ...

  3. ###《VIM实用技巧》

    ###<VIM实用技巧> #@author: gr #@date: 2015-11-20 #@email: forgerui@gmail.com <VIM实用技巧>阅读笔记. ...

  4. iOS开发——app审核指导方针(官网)

    iOS 开发后上传到App Store审核的指导方针 ——苹果官网介绍地址 https://developer.apple.com/app-store/review/guidelines/

  5. 生成 网站“面包屑” XML

    using System; using System.Collections.Generic; using System.IO; using System.Threading; using Syste ...

  6. 用angular实时获取本地localStorage数据,实现一个模拟后台数据登入的效果

    研究了一上午,终于做出了,实时获取本地localStorage来模拟注册登入~~~ <!DOCTYPE html><html><head lang="en&qu ...

  7. spark(一) build

    (1)编译前的准备工作,安装jdk,解压maven,解压spark,解压scala并配置相关的环境变量 export JAVA_HOME=/opt/module/jdk1.6.0_45 export ...

  8. 转 在无法通过yum下载非标准包时,怎么办

    在CentOS下,我们可以通过yum来下载或更新rpm包,但是标准的源(repository)里只提供一部分的rpm包,虽然大部分情况下,这些包是够用的.但是有时候还是需要下载其他的一些非标准的包,如 ...

  9. 闭包(Closures)

    浅析 JavaScript 中的闭包(Closures) 一.前言 对于 JavaScript 来说,闭包是一个非常强大的特征.但对于刚开始接触的初学者来说它又似乎是特别高深的.今天我们一起来揭开闭包 ...

  10. linux源码分析2

    linux源码分析 这里使用的linux版本是4.8,x86体系. 这篇是 http://home.ustc.edu.cn/~boj/courses/linux_kernel/1_boot.html  ...