文档章节

python设计模式(一)--简单工厂(中)

极光火狐狸
 极光火狐狸
发布于 2016/05/10 17:46
字数 448
阅读 49
收藏 4
点赞 2
评论 0

最近正在持续更新源码库,代码都是参考大话设计模式翻成python版,完整代码片段请到github上去下载.

https://github.com/zhengtong0898/python-patterns

 

参考:

    书籍<<大话设计模式>> 第二章 2.1 -- 2.3

 

Python 3.x

# -.- coding:utf-8 -.-
# __author__ = 'zhengtong'
# 知识点:面向对象的编程,并不是类越多越好,类的划分是为了封装,
#         但分类的基础是抽象,具有相同属性和功能的对象的抽象集合才是类。

_price_repr = '单价:'
_number_repr = '数量:'
_total_repr = '合计:'


class CashSuper:
    """现金收取类(抽象类)"""

    def __init__(self, money):
        self.money = money

    def accept_cash(self):
        raise NotImplementedError


class CashNormal(CashSuper):
    """正常收费子类"""

    def accept_cash(self):
        return self.money


class CashRebate(CashSuper):
    """打折收费子类"""

    def __init__(self, rebate, **kwargs):
        """
        这里为什么采用**kwargs, 请参考下面这个链接:
        http://my.oschina.net/zhengtong0898/blog/670917
        """
        super(CashRebate, self).__init__(**kwargs)
        self.rebate = rebate

    def accept_cash(self):
        return self.money * self.rebate


class CashReturn(CashSuper):
    """返利收费子类"""

    def __init__(self, condition, money_return, **kwargs):
        super(CashReturn, self).__init__(**kwargs)
        self.condition = int(condition)
        self.money_return = int(money_return)

    def accept_cash(self):
        result = self.money
        # 当满足了返利条件, 则采用计算规则.
        if self.money >= self.condition:
            result = self.money - int(self.money / self.condition) * self.money_return
        return result


class CashFactory:
    """现金收费工厂类"""

    @staticmethod
    def create_cash_accept(typed, **kwargs):
        if typed == 1:
            result = CashNormal(**kwargs).accept_cash()
        elif typed == 2:
            result = CashReturn(300, 100, **kwargs).accept_cash()
        elif typed == 3:
            result = CashRebate(0.8, **kwargs).accept_cash()
        else:
            raise KeyError('无效的返利选择')
        return result


def main():
    result = 0
    while True:
        try:
            prices = int(input(_price_repr))
            number = int(input(_number_repr))
            price_off = int(input('返利模式: 1(正常收费), 2(满300返100), 3(打8折):'))
            money = CashFactory.create_cash_accept(price_off, money=prices*number)
            result += money
            print(_price_repr, prices, _number_repr, number, _total_repr, money)
        except KeyboardInterrupt:
            print('')
            print('oops: 检测到Ctrl + C组合键, 正在返回总费用并推出程序')
            break
    return result


if __name__ == '__main__':
    print('温馨提示:输入Ctrl + C组合键可得到总数和退出程序.')
    print(main())

 

© 著作权归作者所有

共有 人打赏支持
极光火狐狸
粉丝 11
博文 29
码字总数 14739
作品 0
普陀
C#设计模式(2)——简单工厂模式

一、引言   这个系列也是自己对设计模式的一些学习笔记,希望对一些初学设计模式的人有所帮助的,在上一个专题中介绍了单例模式,在这个专题中继续为大家介绍一个比较容易理解的模式——简单工...

技术小胖子 ⋅ 2017/11/08 ⋅ 0

设计模式梳理(一)

设计模式梳理(一) 总体来说设计模式分为三大类: @案例源码地址:https://gitlab.com/lxqxsyu/DisgnPattern 创建型模式 简单工厂模式 工厂类是整个模式的关键。它包含必要的判断逻辑,能够...

lxq_xsyu ⋅ 2017/11/02 ⋅ 0

简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别

转载:原地址http://www.cnblogs.com/zhangchenliang/p/3700820.html 简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别 结合简单示例和UML图,讲解工厂模式简单原理。 一、引子 话说...

法斗斗 ⋅ 05/08 ⋅ 0

设计模式.策略模式

策略模式跟抽象工厂非常相似,基本逻辑是根据需要实例化出需要用的类。不同的是策略模式需要调用者非常清晰的知道有哪些策略,各个策略的调用规则,而抽象工厂的话,需要知道有哪些类,找到调...

技术小胖子 ⋅ 2017/11/08 ⋅ 0

[设计模式]简单工厂模式

简介 简单工厂模式 (Simple Factory) 又叫静态工厂方法(Static Factory Method)模式。 简单工厂模式通常是定义一个工厂类,这个类可以根据不同变量返回不同类的产品实例。 简单工厂模式是一...

静默虚空 ⋅ 2015/06/03 ⋅ 0

【设计模式之】 工厂模式

1、介绍 属于创建型设计模式,需要生成的对象叫做产品 ,生成对象的地方叫做工厂 。 使用场景:在任何需要生成复杂对象的地方,都可以使用工厂方法模式。 直接用new可以完成的不需要用工厂模...

卯金刀GG ⋅ 02/27 ⋅ 0

设计模式Java Design Pattern-工厂方法模式FactoryMethod

我的博客 一、 设计模式的分类 大体可以分为三类: 创建型模式(5个) 单例模式、原型模式、工厂方法模式、抽象工厂模式、建造者模式 结构性模式(7个) 适配器模式、装饰器模式、代理模式、...

勇敢写信 ⋅ 03/22 ⋅ 0

一天一篇设计模式之--工厂模式与抽象工厂模式(创建型模式)

工厂模式与抽象工厂模式主要解决接口选择问题。 一、工厂模式 当明确计划需要在不同条件下创建不同实例时,可以使用工厂模式。 实例:发送邮件或者短信 1、创建发送信息的接口 2、创建两个实...

Timor_张先生 ⋅ 04/10 ⋅ 0

设计模式之简单工厂模式学习笔记

定义 简单工厂模式又称静态工厂模式。可以根据参数的不同返回不同类的实例。定义一个类来创建其它类的实例。 角色 简单工厂模式包含如下角色 Factory:工厂角色 Product:抽象产品角色 Conc...

Javahih ⋅ 04/24 ⋅ 0

基于Python的信号库 Blinker

环境 Python 3.6.4 简介 Blinker是一个基于Python的强大的信号库,支持一对一、一对多的订阅发布模式,支持发送任意大小的数据等等,且线程安全。 安装 使用 为单例模式 signal 使用了单例模...

流月0 ⋅ 06/09 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

大数据,必须掌握的10项顶级安全技术

我们看到越来越多的数据泄漏事故、勒索软件和其他类型的网络攻击,这使得安全成为一个热门话题。 去年,企业IT面临的威胁仍然处于非常高的水平,每天都会看到媒体报道大量数据泄漏事故和攻击...

p柯西 ⋅ 39分钟前 ⋅ 0

Linux下安装配置Hadoop2.7.6

前提 安装jdk 下载 wget http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-2.7.6/hadoop-2.7.6.tar.gz 解压 配置 vim /etc/profile # 配置java环境变量 export JAVA_HOME=/opt/jdk1......

晨猫 ⋅ 45分钟前 ⋅ 0

crontab工具介绍

crontab crontab 是一个用于设置周期性被执行的任务工具。 周期性执行的任务列表称为Cron Table crontab(选项)(参数) -e:编辑该用户的计时器设置; -l:列出该用户的计时器设置; -r:删除该...

Linux学习笔记 ⋅ 今天 ⋅ 0

深入Java多线程——Java内存模型深入(2)

5. final域的内存语义 5.1 final域的重排序规则 1.对于final域,编译器和处理器要遵守两个重排序规则: (1)在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用...

江左煤郎 ⋅ 今天 ⋅ 0

面试-正向代理和反向代理

面试-正向代理和反向代理 Nginx 是一个高性能的反向代理服务器,但同时也支持正向代理方式的配置。

秋日芒草 ⋅ 今天 ⋅ 0

Spring 依赖注入(DI)

1、Setter方法注入: 通过设置方法注入依赖。这种方法既简单又常用。 类中定义set()方法: public class HelloWorldOutput{ HelloWorld helloWorld; public void setHelloWorld...

霍淇滨 ⋅ 昨天 ⋅ 0

马氏距离与欧氏距离

马氏距离 马氏距离也可以定义为两个服从同一分布并且其协方差矩阵为Σ的随机变量之间的差异程度。 如果协方差矩阵为单位矩阵,那么马氏距离就简化为欧氏距离,如果协方差矩阵为对角阵,则其也...

漫步当下 ⋅ 昨天 ⋅ 0

聊聊spring cloud的RequestRateLimiterGatewayFilter

序 本文主要研究一下spring cloud的RequestRateLimiterGatewayFilter GatewayAutoConfiguration @Configuration@ConditionalOnProperty(name = "spring.cloud.gateway.enabled", matchIfMi......

go4it ⋅ 昨天 ⋅ 0

Spring clound 组件

Spring Cloud技术应用从场景上可以分为两大类:润物无声类和独挑大梁类。 润物无声,融合在每个微服务中、依赖其它组件并为其提供服务。 Ribbon,客户端负载均衡,特性有区域亲和、重试机制。...

英雄有梦没死就别停 ⋅ 昨天 ⋅ 0

Confluence 6 重新获得站点备份文件

Confluence 将会创建备份,同时压缩 XML 文件后存储熬你的 <home-directory>/backups> 目录中。你需要自己访问你安装的 Confluence 服务器,并且从服务器上获得这个文件。 运行从 Confluence...

honeymose ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部