python第十五课面向对象(四)

多态

多态的概念是应用于Java和C#这一类强类型语言中,而Python崇尚“鸭子类型”。

所谓多态:定义时的类型和运行时的类型不一样,此时就成为多态

Python伪代码实现Java或C#的多态

class F1(object):

    def show(self):

        print 'F1.show'

class S1(F1):

    def show(self):

        print 'S1.show'

class S2(F1):

    def show(self):

        print 'S2.show'

# 由于在Java或C#中定义函数参数时,必须指定参数的类型# 为了让Func函数既可以执行S1对象的show方法,又可以执行S2对象的show方法,所以,定义了一个S1和S2类的父类# 而实际传入的参数是:S1对象和S2对象

def Func(F1 obj):

    """Func函数需要接收一个F1类型或者F1子类的类型"""

    print obj.show()

s1_obj = S1()

Func(s1_obj) # 在Func函数中传入S1类的对象 s1_obj,执行 S1 的show方法,结果:S1.show

 

s2_obj = S2()

Func(s2_obj) # 在Func函数中传入Ss类的对象 ss_obj,执行 Ss 的show方法,结果:S2.show

Python “鸭子类型”

class F1(object):

    def show(self):

        print 'F1.show'

class S1(F1):

 

    def show(self):

        print 'S1.show'

class S2(F1):

 

    def show(self):

        print 'S2.show'

def Func(obj):

    print obj.show()

 

s1_obj = S1()

Func(s1_obj)

 

s2_obj = S2()

Func(s2_obj)

 

练习:设计类

1. 设计一个卖车的4S店,该怎样做呢?

# 定义车类class Car(object):

 

    # 定义车的方法

    def move(self):

        print("---车在移动---")

 

    def stop(self):

        print("---停车---")

# 定义一个销售车的店类class CarStore(object):

 

    def order(self):

        self.car = Car() #找一辆车

        self.car.move()

        self.car.stop()

说明

上面的4s店,只能销售那一种类型的车

如果这个是个销售北京现代品牌的车,比如伊兰特、索纳塔等,该怎样做呢?

2. 设计一个卖北京现代车的4S店

# 定义伊兰特车类

class YilanteCar(object):

    # 定义车的方法

    def move(self):

        print("---车在移动---")

 

    def stop(self):

        print("---停车---")

# 定义索纳塔车类class SuonataCar(object):

 

    # 定义车的方法

    def move(self):

        print("---车在移动---")

 

    def stop(self):

        print("---停车---")

# 定义一个销售北京现代车的店类

class CarStore(object):

    def order(self, typeName):

        #根据客户的不同要求,生成不同的类型的车

        if typeName == "伊兰特":

            car = YilanteCar()

        elif typeName == "索纳塔":

            car = SuonataCar()

        return car

这样做,不太好,因为当北京现代又生产一种新类型的车时,又得在CarStore类中修改,有没有好的解决办法呢?

 

工厂模式

1. 简单工厂模式

上一个问题,该怎样解决呢?

1.1.使用函数实现

# 定义伊兰特车类

class YilanteCar(object):

    # 定义车的方法

    def move(self):

        print("---车在移动---")

 

    def stop(self):

        print("---停车---")

# 定义索纳塔车类

class SuonataCar(object):

    # 定义车的方法

    def move(self):

        print("---车在移动---")

    def stop(self):

        print("---停车---")

# 用来生成具体的对象def createCar(typeName):

    if typeName == "伊兰特":

        car = YilanteCar()

    elif typeName == "索纳塔":

        car = SuonataCar()

    return car

# 定义一个销售北京现代车的店类

class CarStore(object):

    def order(self, typeName):

        # 让工厂根据类型,生产一辆汽车

        car = createCar(typeName)

        return car

1.2.使用类来实现

# 定义伊兰特车类

class YilanteCar(object):

    # 定义车的方法

    def move(self):

        print("---车在移动---")

 

    def stop(self):

        print("---停车---")

# 定义索纳塔车类

class SuonataCar(object):

    # 定义车的方法

    def move(self):

        print("---车在移动---")

    def stop(self):

        print("---停车---")

# 定义一个生产汽车的工厂,让其根据具体的订单生产车class CarFactory(object):

    def createCar(self,typeName):

        if typeName == "伊兰特":

            car = YilanteCar()

        elif typeName == "索纳塔":

            car = SuonataCar()

        return car

# 定义一个销售北京现代车的店类

class CarStore(object):

    def __init__(self):

        #设置4s店的指定生产汽车的工厂

        self.carFactory = CarFactory()

    def order(self, typeName):

        # 让工厂根据类型,生产一辆汽车

        car = self.carFactory.createCar(typeName)

        return car

咋一看来,好像只是把生产环节重新创建了一个类,这确实比较像是一种编程习惯,此种解决方式被称作简单工厂模式

工厂函数、工厂类对具体的生成环节进行了封装,这样有利于代码的后需扩展,即把功能划分的更具体,4s店只负责销售,汽车厂只负责制造

2. 工厂方法模式

多种品牌的汽车4S店

当买车时,有很多种品牌可以选择,比如北京现代、别克、凯迪拉克、特斯拉等,那么此时该怎样进行设计呢?

# 定义一个基本的4S店类

class CarStore(object):

    #仅仅是定义了有这个方法,并没有实现,具体功能,这个需要在子类中实现

    def createCar(self, typeName):

        pass

    def order(self, typeName):

        # 让工厂根据类型,生产一辆汽车

        self.car = self.createCar(typeName)

        self.car.move()

        self.car.stop()

# 定义一个北京现代4S店类class XiandaiCarStore(CarStore):

 

    def createCar(self, typeName):

        self.carFactory = CarFactory()

        return self.carFactory.createCar(typeName)

 

# 定义伊兰特车类

class YilanteCar(object):

    # 定义车的方法

    def move(self):

        print("---车在移动---")

 

    def stop(self):

        print("---停车---")

# 定义索纳塔车类

class SuonataCar(object):

    # 定义车的方法

    def move(self):

        print("---车在移动---")

    def stop(self):

        print("---停车---")

# 定义一个生产汽车的工厂,让其根据具体得订单生产车

class CarFactory(object):

    def createCar(self,typeName):

        self.typeName = typeName

        if self.typeName == "伊兰特":

            self.car = YilanteCar()

        elif self.typeName == "索纳塔":

            self.car = SuonataCar()

 

        return self.car

 

suonata = XiandaiCarStore()

suonata.order("索纳塔")

最后来看看工厂方法模式的定义

定义了一个创建对象的接口(可以理解为函数),但由子类决定要实例化的类是哪一个,工厂方法模式让类的实例化推迟到子类,抽象的CarStore提供了一个创建对象的方法createCar,也叫作工厂方法

子类真正实现这个createCar方法创建出具体产品。 创建者类不需要直到实际创建的产品是哪一个,选择了使用了哪个子类,自然也就决定了实际创建的产品是什么。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值