抽象工厂模式(python版)
http://blog.csdn.net/ponder008/article/details/6886039
抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
优点:易于交换“产品系列”,只要更改相应的工厂即可。
缺点:建立产品的时候很繁琐,需要增加和修改很多东西。
优化1:为了避免客户端有过多的逻辑判断,可以封装出一个简单工厂类来生成产品类。
优化2:为了减少简单工厂类里面的逻辑判断,可以采用“反射”机制,直接根据外部的配置文件读取出需要使用产品类的信息。
- #encoding=utf-8
- #
- #by panda
- #抽象工厂模式
- def printInfo(info):
- print unicode(info, 'utf-8').encode('gbk')
- #抽象产品A:user表
- class IUser():
- def Insert(self):
- pass
- def GetUser(self):
- pass
- #sqlserver实现的User
- class SqlserverUser(IUser):
- def Insert(self):
- printInfo("在SQL Server中给User表增加一条记录")
- def GetUser(self):
- printInfo("在SQL Server中得到User表的一条记录")
- #Access实现的User
- class AccessUser(IUser):
- def Insert(self):
- printInfo("在Access中给User表增加一条记录")
- def GetUser(self):
- printInfo("在Access中得到User表一条记录")
- #抽象产品B:部门表
- class IDepartment():
- def Insert(self):
- pass
- def GetUser(self):
- pass
- #sqlserver实现的Department
- class SqlserverDepartment(IUser):
- def Insert(self):
- printInfo("在SQL Server中给Department表增加一条记录")
- def GetUser(self):
- printInfo("在SQL Server中得到Department表的一条记录")
- #Access实现的Department
- class AccessDepartment(IUser):
- def Insert(self):
- printInfo("在Access中给Department表增加一条记录")
- def GetUser(self):
- printInfo("在Access中得到Department表一条记录")
- #抽象工厂
- class IFactory():
- def CreateUser(self):
- pass
- def CreateDepartment(self):
- pass
- #sql server工厂
- class SqlServerFactory(IFactory):
- def CreateUser(self):
- return SqlserverUser()
- def CreateDepartment(self):
- return SqlserverDepartment()
- #access工厂
- class AccessFactory(IFactory):
- def CreateUser(self):
- return AccessUser()
- def CreateDepartment(self):
- return AccessDepartment()
- #优化一:采用一个简单工厂类,封装逻辑判断操作
- class DataAccess():
- # db = "Sqlserver"
- db = "Access"
- @staticmethod
- def CreateUser():
- if (DataAccess.db == "Sqlserver"):
- return SqlserverUser()
- elif(DataAccess.db == "Access"):
- return AccessUser()
- @staticmethod
- def CreateDepartment():
- if (DataAccess.db == "Sqlserver"):
- return SqlserverDepartment()
- elif(DataAccess.db == "Access"):
- return AccessDepartment()
- #优化二:采用反射机制,避免使用太多判断
- ##以下信息可以从配置文件中获取
- DBType = 'Sqlserver' #'Access'
- DBTab_User = 'User'
- DBTab_Department = 'Department'
- class DataAccessPro():
- # db = "Sqlserver"
- db = "Access"
- @staticmethod
- def CreateUser():
- funName = DBType + DBTab_User
- return eval(funName)() #eval 将其中的字符串转化为python表达式
- @staticmethod
- def CreateDepartment():
- funName = DBType + DBTab_Department
- return eval(funName)()
- def clientUI():
- printInfo("\n--------抽象工厂方法--------")
- factory = SqlServerFactory()
- iu = factory.CreateUser()
- iu.Insert()
- iu.GetUser()
- id = factory.CreateDepartment()
- id.Insert()
- id.GetUser()
- printInfo("\n--抽象工厂方法+简单工厂方法--")
- iu = DataAccess.CreateUser()
- iu.Insert()
- iu.GetUser()
- id = DataAccess.CreateDepartment()
- id.Insert()
- id.GetUser()
- printInfo("\n-抽象工厂方法+简单工厂方法+反射-")
- iu = DataAccessPro.CreateUser()
- iu.Insert()
- iu.GetUser()
- id = DataAccessPro.CreateDepartment()
- id.Insert()
- id.GetUser()
- return
- if __name__ == '__main__':
- clientUI();
抽象工厂模式(python版)的更多相关文章
- 大话设计模式C++版——抽象工厂模式
前面说过,简单工厂模式是最基础的一种设计模式,那以工厂命名的设计模式就是23种设计模式中最多的一种,他们一脉相承,一步一步进化而来,这里就是其中的最后一种——抽象工厂模式(Abstract Facto ...
- 抽象工厂模式(Java与Kotlin版)
前文推送 设计模式 简单工厂模式(Java与Kotlin版) 工厂方法模式(Java与Kotlin版) Kotlin基础知识 Kotlin入门第一课:从对比Java开始 Kotlin入门第二课:集合操 ...
- python风格的抽象工厂模式
抽象工厂模式: 提供一个接口,用户创建多个相关或依赖对象,而不需要指定具体类. 原则: 依赖抽象,不依赖具体类. 实例: 用不同原材料制作不同口味的披萨,创建不同原材料的工厂,不同实体店做出口味不同的 ...
- 设计模式(Python)-简单工厂,工厂方法和抽象工厂模式
本系列文章是希望将软件项目中最常见的设计模式用通俗易懂的语言来讲解清楚,并通过Python来实现,每个设计模式都是围绕如下三个问题: 为什么?即为什么要使用这个设计模式,在使用这个模式之前存在什么样的 ...
- [Python编程实战] 第一章 python的创建型设计模式1.1抽象工厂模式
注:关乎对象的创建方式的设计模式就是“创建型设计模式”(creational design pattern) 1.1 抽象工厂模式 “抽象工厂模式”(Abstract Factory Pattern) ...
- 大话设计模式Python实现- 抽象工厂模式
抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的类 下面是一个抽象工厂的demo: #!/usr/bin/env pyth ...
- 浅谈Python设计模式 - 抽象工厂模式
声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 在上一篇我们对工厂模式中的普通工厂模式有了一定的了解,其实抽象工作就是 表示针对 ...
- python 设计模式之工厂模式 Factory Pattern (简单工厂模式,工厂方法模式,抽象工厂模式)
十一回了趟老家,十一前工作一大堆忙成了狗,十一回来后又积累了一大堆又 忙成了狗,今天刚好抽了一点空开始写工厂方法模式 我看了<Head First 设计模式>P109--P133 这25页 ...
- [Python设计模式] 第15章 如何兼容各种DB——抽象工厂模式
github地址:https://github.com/cheesezh/python_design_patterns 题目 如何让一个程序,可以灵活替换数据库? 基础版本 class User(): ...
随机推荐
- JDBC之数据库操作
JDBC重要界面有: java.sgl.DriverManager:完成驱动程序的装载和建立新的数据库连接. java.sgl.Connection:表示对某一指定数据库的连接. java.sgl.S ...
- mssql 查询效率
(1)临时表.表变量 据说:当数据量<100行数据时使用表变量,数据量较大时使用临时表(可创建索引提高查询效率). 表变量只能创建主键或唯一索引,准确讲是约束不是索引. (2)存储过程直接在查询 ...
- 有关开机后win7任务管理器不断重启的问题,我的情况是sendrpt.exe导致的(转载,有补充)
SendRpt.exe提示SendRpt:Error资源管理器未响应 打开电脑就发现资源管理器就未响应,还发现一个标题为Report sending utility的SendRpt.exe进程占用CP ...
- ios开发入门篇(四):UIWebView结合UISearchBar的简单用法
UIWebView是ios开发中比较常用的一个控件.我们可以用它来浏览网页.打开文档等,今天笔者在这里简单介绍下UIWebView和UISearchBar结合起来的用法,做一个简单的类浏览器. 一: ...
- (转)mysql、sqlserver、oracle的默认事务的隔离级别
1.mysql的默认事务的隔离级别:可重复读取(repeatable read); 2.sqlserver的默认事务的隔离级别:提交读取(read committed); 3.oracle的默认事务的 ...
- requirejs实验002. r.js合并文件. 初体验.
requirejs的官网上有介绍如何使用r.js合并,压缩文件的.http://requirejs.org/docs/optimization.html https://github.com/jrbu ...
- linux同步
1. 内核同步 主要是防止多核处理器同时访问修改某段代码,或者在对设备驱动程序进行临界区的保护. 1 .互斥量 头文件 #include<linux/mutex.h> 初始化方法: 静态初 ...
- DEDECMS中,自增长标签
自增长 arclist 标签下使用 [field:global.autoindex/] 默认从1开始 channel 标签下使用 [field:global.autoindex/] 默认从0开始 ch ...
- 第八章 Qt GUI之对话框使用
第八章 Qt GUI之对话框使用 对话框可以是模态(modal)的或非模态(modeless)两种.当我们在一个用户界面程序里面对一个对话框(比如选择文件对话框)的操作没有结束前,界面的其他窗口无法操 ...
- 【转】oracle中触发器中:new和:old 的使用方法
create or replace trigger TRI_PrintTest before delete or insert or update on TEST_EXAM --触发事件 for ea ...