创建型模式--工厂模式

来源:互联网 发布:淘宝苹果4s外壳多少钱 编辑:程序博客网 时间:2024/06/06 13:58

工厂模式包含一个超类(父类),这个超类提供了一个抽象化的接口来创建一个特定类型的对象,而不是决定哪个对象可以被创建。

也就是说:定义一个创建对象的接口,但由子类决定要实例化类的哪一个;即通过子类来创建对象。工厂方法使一个类的是实例化延迟到其子类。

基本思想:

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.genderclass Male(Person):    def __init__(self, name):        print 'Hello Mr.' + nameclass Female(Person):    def __init__(self, name):        print 'Hello Miss.' + nameclass 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):        passclass BMW(Car):    def __init__(self, carname):        self.__name = carname    def drive(self):        print 'Drive the BMW as ' + self.__nameclass Benz(Car):    def __init__(self, carname):        self.__name = carname    def drive(self):        print 'Drive the Benz as ' + self.__nameclass 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 BMWDrive the Benz as Benz


此外还有工厂方法模式

工厂方法模式是工厂类被具体的工厂继承。

1 抽象工厂角色:这是工厂方法模式的核心,与具体的程序无关,具体工厂接口必须继承它

2 具体工厂角色:与具体业务逻辑相关,由应用程序调用以创建对应的具体产品对象。

3 抽象产品角色:是具体产品继承的父类或者是实现的接口

4 具体产品角色:由一个具体类实现。


这里仅仅是举了个简单的例子,详细可参考HEAD FIRST设计模式