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. JavaScript之表格修改

    讲到表格,我们不免都了解它的属性及用途. colspan跨列(纵向的)和rowspan跨行(横向的). 表格中<tr></tr>标签标示行标签:<td></t ...

  2. Oracle学习第二天---Profile的使用

    环境:Oracle 11g 一.权限的传递 1.如果传递的是对象权限,就在后面加入with grant option: eg:system用户有张temp的表,只想usertest用户拥有查询的权限, ...

  3. 第四篇、微信小程序-icon组件

    属性: 效果图: test.wxml <!--成功图标--> <icon type="success" size="40"/> < ...

  4. des算法的C#实现

    DES是Data Encryption Standard(数据加密标准)的缩写.它是一种通过56位密钥来加密64位数据的方法. public class EncryptUtility{    #reg ...

  5. [Guava学习笔记]Basic Utilities: Null, 前置条件, Object方法, 排序, 异常

    我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3842433.html,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体验 ...

  6. C++对象的JSON序列化与反序列化探索续-复杂对象的序列化与反序列化

    本文是基本上一篇博文进行改进而成,上一篇请见: C++对象的JSON序列化与反序列化探索 此处就不多说了,直接上代码. 1. 序列化基类 #pragma once #include <strin ...

  7. php curl抓取远程页面内容的代码

    使用php curl抓取远程页面内容的例子. 代码如下: <?php /** * php curl抓取远程网页内容 * edit by www.jbxue.com */ $curlPost = ...

  8. Eclipse查看源码乱码问题

    在同一个工作区下,依赖的Jar包如果既有GBK编码,又有UTF-8编码,就会出现的问题. 常规解决方法 1.切换工作区编码.麻烦,效率低. 2.设置Jar包编码,只有Eclipse4.2支持,4.0以 ...

  9. phpcmsv9全站搜索,不限模型

    简单修改一下v9默认的搜索功能,可以不按模型搜索全站内容 下面是被修改后的search模块中的index.php文件 <?php defined('IN_PHPCMS') or exit('No ...

  10. DB2 SQL 递归实现多行合并

    最终效果 原始数据: 转换脚本: WITH post_a AS ( SELECT DISTINCT T.EMP_NO,S.CODE_ FROM inscndb.DTFMA000_EMP_POST T ...