[Python]Python与设计模式2——工厂类相关模式

此系列是对《阿里巴巴技术协会-Python与设计模式系列课程》学习笔记。

一、快餐点餐系统

麦当劳的自助点餐系统一般是这样的:在一个大的触摸屏上,有三类可选择的餐品:汉堡等主食、小吃、饮料。当我们选择好自己的食物,支付完成后订单就生成了。下面我们用“工厂模式”来生成这些食物的逻辑主题。

主食汉堡类

#汉堡
class Burger():
    name = ""
    price = 0.0
    def getPrice(self):
        return self.price
    def setPrice(self,price):
        self.price = price
    def getName(self):
        return self.name
#两个汉堡子类
class cheeseBuger(Burger):
    def __init__(self):
        self.name = "cheese burger"
        self.price = 10.0
class spicychickenBuger(Burger):
    def __init__(self):
        self.name = "spicy chicken burger"
        self.price = 15.0

小吃类

#小吃
class Snack():
    name = ""
    price = 0.0
    def getPrice(self):
        return self.price
    def setPrice(self,price):
        self.price = price
    def getName(self):
        return self.name
#两种小吃
class chips(Snack):
    def __init__(self):
        self.name = "chips"
        self.price = 6.0
class chickenWings(Snack):
    def __init__(self):
        self.name = "chicken wings"
        self.price = 9.0

饮料类

#饮料
class Beverage():
    name = ""
    price = ""
    def getPrice(self):
        return self.price
    def setPrice(self,price):
        self.price = price
    def getName(self):
        return self.name

class coke(Beverage):
    def __init__(self):
        self.name = "coke"
        self.price = 3.5
class milk(Beverage):
    def __init__(self):
        self.name = "milk"
        self.price = 5.5

以上的Burger、Snack、Beverage都可认为是该快餐店的产品,由于只提供了抽象方法,我们把他们叫做抽象产品类,而cheese Burger等6个由抽象产品类衍化生出的子类,叫做具体产品类。

工厂类

#工厂
class foodFactory():
    type = ""
    def createFood(self,foodClass):
        print(self.type,"factory produce a instance.")
        foodIns = foodClass()
        return  foodIns

class burgerFactory(foodFactory):
    def __init__(self):
        self.type = "BURGER"
class snackFactory(foodFactory):
    def __init__(self):
        self.type = "SNACK"
class beverageFactory(foodFactory):
    def __init__(self):
        self.type = "BEVERAGE"

同样,foodFactory为抽象的工厂类,burgerFactory、snackFactory、beverageFactory为具体的工长类。

在业务场景中,工厂模式如何“生产”产品呢?

if __name__ == '__main__':
	#实例化具体工厂
    burger_factory = burgerFactory()
    snack_factory = snackFactory()
    beverage_factory = beverageFactory()
	#工厂根据传入的参数直接生产对应的产品
    cheese_burger = burger_factory.createFood(cheeseBuger)
    print(cheese_burger.getName(),cheese_burger.getPrice())
    chicken_wings = snack_factory.createFood(chickenWings)
    print(chicken_wings.getName(),chicken_wings.getPrice())
    coke_drink = beverage_factory.createFood(coke)
    print(coke_drink.getName(),coke_drink.getPrice())

在这里插入图片描述
可见,业务中先生成了具体的工厂,然后调用工程中的createFood()方法和对应对应的参数直接生成产品实例,而后即可以调用产品实例的方法或者属性。

工厂模式:定义一个用户与创建对象的接口,让子类决定实例化哪个类。工厂方法使一个类的实例化延迟到其子类。产品类定义产品的公共属性和接口,工厂类定义产品实例化的“方式”。(其实看不太懂这段在说什么 ?)

工厂模式的优缺点和应用

优点:

①具有非常好的封装性,代码结构清晰

②屏蔽产品类,使产品的被使用业务场景和产品的功能细节可以分而开发进行,是比较典型的解耦框架

缺点:

①工厂模式相对于直接生成实例过程要复杂一些,所以在小项目中,可以不使用

②抽象工厂模式中,产品类的扩展比较麻烦,毕竟,每一个工厂对应一类产品,产品扩展,意味着抽象工厂也要扩展

应用场景:

当系统实例要求你交灵活和可扩展时,可以考虑工厂模式或者抽象工厂模式。比如,在通信系统中,高层通信协议会很多样化,同时,上层协议依赖于下层协议,那么久可以对应建立对应层级的抽象工程,根据不同的“产品需求”去生产定制的实例

半知半解~ ? ? ?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我! 毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值