工厂模式包含一个超类(父类),这个超类提供了一个抽象化的接口来创建一个特定类型的对象,而不是决定哪个对象可以被创建。
也就是说:定义一个创建对象的接口,但由子类决定要实例化类的哪一个;即通过子类来创建对象。工厂方法使一个类的是实例化延迟到其子类。
基本思想:
l 定义一个抽象的工厂接口类
l 定义一个抽象的产品接口类
l 根据需要从产品接口派生产品子类
l 对于每一个产品子类,从工厂接口派生工厂子类,负责该产品的创建
l 客户端根据实际需要,调用工厂子类,创建所需要的产品。
1 普通工厂模式:就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。
2 多个工厂方法模式:是对普通工厂模式的改进,多个工厂方法模式是提供多个工厂方法,分别创建对象
3 静态工厂方法模式:将多个工厂方法模式的方法设置为静态的,不需要创建实例,直接调用即可。
总结:
凡是出现大量的产品需要创建,并且具有共同的接口时,可以通过工厂方法进行创建。
普通工厂模式如果传入的字符串有误,不能正确创建对象,静态工厂方法模式,不需要实例化工厂类。
大多数情况下,选用静态工厂方法模式。
场景1:
1. 一个基类Person,包涵获取名字、性别的方法。该基类有2个子类Male和Female,可以打招呼,还有一个工厂类。
2. 工厂类有一个方法名get_person有两个输入参数:名字和性别
3. 用户使用工厂类,通过调用get_person方法。
在程序运行期间,用户传递性别给工厂,工厂创建一个与性别有关的对象。
因此工厂类运行期间,决定了哪个对象应该被创建。
class Person():
def __init__(self):
self.name = None
self.gender = None
def get_name(self):
return self.name
def get_gender(self):
return self.gender
class Male(Person):
def __init__(self, name):
print 'Hello Mr.' + name
class Female(Person):
def __init__(self, name):
print 'Hello Miss.' + name
class Factory():
def get_person(self, name, gender):
if gender == 'M':
return Male(name)
if gender == 'F':
return Female(name)
if __name__ == '__main__':
factory = Factory()
person = factory.get_person('Lanli', 'M')
运行结果:
Hello Mr.Lanli
场景二:
汽车都有驾驶的功能,汽车类做为父类,宝马和奔驰都属于汽车,定义一个工厂类Drive,在该类种决定具体要实例化哪一个对象。
# -*- coding: utf-8 -*-
class Car():
def drive(self):
pass
class BMW(Car):
def __init__(self, carname):
self.__name = carname
def drive(self):
print 'Drive the BMW as ' + self.__name
class Benz(Car):
def __init__(self, carname):
self.__name = carname
def drive(self):
print 'Drive the Benz as ' + self.__name
class Drive():
def drive_car(self, name):
if name == 'BMW':
return BMW(name)
if name == 'Benz':
return Benz(name)
#使用全局函数改写工厂类
def driver(name):
if name == 'BMW':
return BMW("BMW")
elif name=="Benz":
return Benz("Benz")
if __name__ == "__main__":
drive = Drive()
d = drive.drive_car('BMW')
d.drive()
drive1 = driver('Benz')
drive1.drive()
运行结果:
Drive the BMW as BMW
Drive the Benz as Benz
此外还有工厂方法模式
工厂方法模式是工厂类被具体的工厂继承。
1 抽象工厂角色:这是工厂方法模式的核心,与具体的程序无关,具体工厂接口必须继承它
2 具体工厂角色:与具体业务逻辑相关,由应用程序调用以创建对应的具体产品对象。
3 抽象产品角色:是具体产品继承的父类或者是实现的接口
4 具体产品角色:由一个具体类实现。
这里仅仅是举了个简单的例子,详细可参考HEAD FIRST设计模式