您的位置:首页 > 编程语言 > Python开发

抽象工厂模式(python版)

2011-10-18 21:13 309 查看
抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

优点:易于交换“产品系列”,只要更改相应的工厂即可。

缺点:建立产品的时候很繁琐,需要增加和修改很多东西。

优化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();


类图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: