1.Simple Factory模式
Simple Factory模式不是独立的设计模式,他是Factory Method模式的一种简单的、特殊的实现。他也被称为静态工厂模式,通常创建者的创建方法被设计为static方便调用,但是python没有static一说。所以可以把创建者也就是工厂设计为一个普通class或全局函数即可。如果是class还需要实例化才能调用工厂方法,而全局函数比较简单,比较接近静态工厂的简便特性。
Simple Factory模式包含以下角色部分,UML可参考下图:
工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑。由一个具体类实现,通常该类的工厂方法是静态的。在python中工厂为一个普通class或全局函数。
抽象产品角色:它一般是具体产品继承的父类或者实现的接口。由接口或者抽象类来实现。在python中抽象产品一般为父类。
具体产品角色:工厂类所创建的对象就是此角色的实例。由一个具体类实现。
Simple Factory
#抽象产品角色
class car:
'''interface as Product'''
def drive(self):
pass
#具体产品角色
class BMW(car):
'''Concrete Product'''
def __init__(self,carname):
self.__name=carname
def drive(self):
print "Drive the BMW as "+self.__name
#具体产品角色
class Benz(car):
'''Concrete Product'''
def __init__(self,carname):
self.__name=carname
def drive(self):
print "Drive the Benz as "+self.__name
#工厂类角色
class driver:
'''Factory also called Creator'''
def driverCar(self,name):
if name=="BMW":
return BMW("BMW")
elif name=="Benz":
return Benz("Benz")
else:
raise MyInputException(name)
if __name__ == "__main__":
print "please input \"BMW\" or \"Benz\" :"
carname=raw_input()
dier=driver()
d=dier.driverCar(carname)
d.drive()
2. Factory Method工厂模式
工厂方法模式去掉了简单工厂模式中工厂方法的静态属性,使得它可以被子类继承。对于python来说,就是工厂类被具体工厂继承。这样在简单工厂模式里集中在工厂方法上的压力可以由工厂方法模式里不同的工厂子类来分担。也就是工厂外面再封装一层。
抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。
具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。
抽象产品角色:它是具体产品继承的父类或者是实现的接口。在python中抽象产品一般为父类。
具体产品角色:具体工厂角色所创建的对象就是此角色的实例。由一个具体类实现。
一个Factory Method代码实例
#抽象产品角色
class car:
'''interface as Product'''
def drive(self):
pass
#具体产品角色
class BMW(car):
'''Concrete Product'''
def __init__(self,carname):
self.__name=carname
def drive(self):
print "Drive the BMW as "+self.__name
#具体产品角色
class Benz(car):
'''Concrete Product'''
def __init__(self,carname):
self.__name=carname
def drive(self):
print "Drive the Benz as "+self.__name
#抽象工厂角色
class driver:
'''Factory also called Creator'''
def driverCar(self):
return car()
#具体工厂角色
class BMWdriver(driver):
'''Concrete Creator'''
def driverCar(self):
return BMW("BMW")
#具体工厂角色
class Benzdriver(driver):
'''Concrete Creator'''
def driverCar(self):
return Benz("Benz")
if __name__ == "__main__":
driver=BMWdriver()
car=driver.driverCar()
car.drive()
driver=Benzdriver()
car=driver.driverCar()
car.drive()