抽象工厂模式(python版)

来源:互联网 发布:php错误类型有哪些 编辑:程序博客网 时间:2024/04/28 18:58
抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
优点:易于交换“产品系列”,只要更改相应的工厂即可。
缺点:建立产品的时候很繁琐,需要增加和修改很多东西。

优化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实现的Userclass SqlserverUser(IUser):    def Insert(self):        printInfo("在SQL Server中给User表增加一条记录")    def GetUser(self):        printInfo("在SQL Server中得到User表的一条记录")#Access实现的Userclass 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实现的Departmentclass SqlserverDepartment(IUser):    def Insert(self):        printInfo("在SQL Server中给Department表增加一条记录")    def GetUser(self):        printInfo("在SQL Server中得到Department表的一条记录")#Access实现的Departmentclass 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()        returnif __name__ == '__main__':    clientUI();

类图


原创粉丝点击