抽象工厂模式(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();
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步