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之触屏事件

    方法一: 新建"MyView"类 package onTouchEvent; import android.content.Context; import android.grap ...

  2. Cisco中删除flash通过tftp服务器恢复

    首先我们来看一下,Cisco路由器中的flash文件.通过show flash 命令来查看. 这时可以看到flash的版本是c1841-ipbasek9-mz.124-12.bin 下面我们删除这个f ...

  3. C#全屏随机位置显示图片的小程序

    想法:将屏幕截图作为程序背景图,在之上弹出提示窗口,选择确定后进行定时图片随机位置显示.(支持ESC键退出) 需要添加的控件:Timer 需要修改的Form1属性为下图红色区域: 资源文件的添加:添加 ...

  4. C# ASPX.NET 文件(图片)下载

    最好使用aspx页面写: protected void Page_Load(object sender,EventArgs e) { if(!IsPostBack) { System.Io.FileS ...

  5. jQuery mouseenter与mouseleave

    mouseenter: 定义和用法 当鼠标指针穿过元素时,会发生 mouseenter 事件. 该事件大多数时候会与 mouseleave 事件一起使用. mouseenter() 方法触发 mous ...

  6. 实现C#给系统其他窗口输入的思路

    将窗口实现浮动,从而不获取焦点 使用系统API获取窗口的句柄 根据数据库或者xml文件等动态添加 使用系统API发送文本到达指定窗口输入框

  7. 接口(interface)

    接口(interface) 接口(interface)定义了一个可由类和结构实现的协定.接口可以包含方法.属性.事件和索引器.接口不提供它所定义的成员的实现-它仅指定实现该接口的类或结构必须提供的成员 ...

  8. OpenGL5-纹理贴图

    代码下载 #include "CELLWinApp.hpp"#include <gl/GLU.h>#include <assert.h>#include & ...

  9. (转)实战Memcached缓存系统(2)Memcached Java API基础之MemcachedClient

    1. 构造函数 public MemcachedClient(InetSocketAddress[] ia) throws IOException; public MemcachedClient(Li ...

  10. js获取键盘按键响应事件(兼容各浏览器)

    <script type="text/javascript" language="JavaScript" charset="UTF-8" ...