工厂模式

  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

xiandai_store = CarStore()
my_car = xiandai_store.order(“索纳塔”)
my_car.move()
my_car.stop()
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

xiandai_store = CarStore()
my_car = xiandai_store.order(“索纳塔”)
my_car.move()
my_car.stop()
咋一看来,好像只是把生产环节重新创建了一个类,这确实比较像是一种编程习惯,此种解决方式被称作简单工厂模式

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

  1. 工厂方法模式
    多种品牌的汽车4S店
    当买车时,有很多种品牌可以选择,比如北京现代、别克、凯迪拉克、特斯拉等,那么此时程序又该怎样进行设计呢?

#定义一个基本的4S店类
class CarStore(object):
#仅仅是定义了这个方法,并没有实现具体功能,这个需要在子类中实现
def createCar(self, typeName):
pass

def xiChe(self):
    pass
    # 省略洗车的过程....>> self.car.x()

def shangBaoXian(self):
    pass
    # 省略上保险的过程....>> self.car.xx()

def shangChePai(self):
    pass
    # 省略上车牌的过程....>> self.car.xxx()

def order(self, typeName):
    # 1. 让工厂根据类型,生产一辆汽车
    self.car = self.createCar(typeName)
    # 2. 洗车
    self.xiChe()
    # 3. 上保险
    self.shangBaoXian()
    # 4. 上车牌
    self.shangChePai()

    # 5. 将车返回给用户
    return self.car

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

def __init__(self):
    #设置4s店的指定生产汽车的工厂
    self.carFactory = XianDaiFactory()

# 重写createCar方法,从而完成现代车具体的生成过程,
# 而其他的像洗车、上牌的功能,都是直接继承自父类,从而让程序更简单了
def createCar(self, typeName):
    return self.carFactory.createCar(typeName)

#定义一个生产汽车的工厂,让其根据具体得订单生产车
class XianDaiFactory(object):
def createCar(self, typeName):
if typeName == “伊兰特”:
car = YilanteCar()
elif typeName == “索纳塔”:
car = SuonataCar()
return car

#定义伊兰特车类
class YilanteCar(object):
# 定义车的方法
def move(self):
print("—车在移动—")
def stop(self):
print("—停车—")

#定义索纳塔车类
class SuonataCar(object):
# 定义车的方法
def move(self):
print("—车在移动—")
def stop(self):
print("—停车—")

suonata = XiandaiCarStore()
my_car = suonata.order(“索纳塔”)
my_car.move()
my_car.stop()
最后来看看工厂方法模式的定义
定义了一个创建对象的接口(可以理解为函数),但由子类决定要实例化的类是哪一个,工厂方法模式让类的实例化推迟到子类,抽象的CarStore提供了一个创建对象的方法createCar,也叫作工厂方法。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值