创建型模式--工厂模式

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

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

基本思想:

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设计模式


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值