浅谈Python设计模式 - 建造者模式
声明:本系列文章主要参考《精通Python设计模式》一书,并且参考一些资料,结合自己的一些看法来总结而来。
建造者模式
当我们想要创建一个由多个部分构成的对象,而且他们的构建需要一步接一步的地完成,只有当各个部分都创建好,这个对象才算完整。 -- 这正是 建造者设计模式的用武之地。
根据《精通Python设计模式》介绍,建造者模式通常用于补充工厂模式的不足,尤其是在如下场景中:
- 要求一个对象有不同的表现,并且希望将对象的构造与表现解耦。
- 要求在某个时间点创建对象,但在稍后的时间点再访问。
个人理解:
由于之前介绍了工厂模式,这边拿创建者模式进行对比下:
工厂模式像是从某宝输入 电脑的关键字 直接进行购买,获得一个已经完整的电脑。而创建者模式,更像是 找个一个电脑的外壳,往该外壳内一步一步的组装零件,最后得到一个完整的电脑。
应用场景:
最常用的一个场景就是操作数据库的 ORM。回想一下,ORM 中一个很重要的概念:延迟加载,其实就是建造者模式最常见的应用。
在一开始将 orm 对象构造出来,但并不实际查询数据,而是在用到具体数据的时候才向数据库进行查询。并且会根据不同的对象,向不同的表进行查询。
示例:(来自书中翻译评审者精简后的代码)
class Pizza:
def __init__(self, builder):
self.garlic = builder.garlic
self.extra_cheese = builder.extra_cheese def __str__(self):
garlic = 'yes' if self.garlic else 'no'
cheese = 'yes' if self.extra_cheese else 'no'
info = ('Garlic: {}'.format(garlic), 'Extra cheese: {}'.format(cheese))
return '\n'.join(info) class PizzaBuilder:
def __init__(self):
self.extra_cheese = False
self.garlic = False def add_garlic(self):
self.garlic = True
return self def add_extra_cheese(self):
self.extra_cheese = True
return self def build(self):
return Pizza(self) if __name__ == '__main__':
pizza = Pizza.PizzaBuilder().add_garlic().add_extra_cheese().build()
print(pizza)
这是一个往pizza中添加配料的过程,即 刚开始创建了一个原味的pizza,随后通过PizzaBuilder一步步往pizza中添加配料,最终得到一个完整的pizza。
同时这里实现了一个 链式调用,所谓的链式调用,也并不是什么神奇的事情,只是在建造者类的每一个方法在为该对象添加了属性之后返回其本身——return self。
over~~~,参考:https://zhuanlan.zhihu.com/p/24624282。
浅谈Python设计模式 - 建造者模式的更多相关文章
- 浅谈Python设计模式 - 外观模式
声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 外观模式 外观模式的核心在于将复杂的内部实现包装起来,只向外界提供简单的调用接口 ...
- 浅谈Python设计模式 - 代理模式
声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 一.在某些应用中,我们想要在访问某个对象之前执行一个或者多个重要的操作,例如,访 ...
- 浅谈Python设计模式 - 工厂模式
声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 工厂模式: 顾名思义,工厂则是根据提供的不同的材料,生产出不同的产品.那么在编程 ...
- 浅谈Python设计模式 - 原型模式
声明,本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 在<精通Python设计模式>中把设计模式分为三种类型: 创建型模式 ...
- 浅谈Python设计模式 -- 责任链模式
声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 之前在最开始就聊了Python设计模式有三种,其中关于创建型和结构型设计模式基本 ...
- 浅谈Python设计模式 - 享元模式
声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 享元模式: 享元模式是一种用于解决资源和性能压力时会使用到的设计模式,它的核心思 ...
- 浅谈Python设计模式 - 抽象工厂模式
声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 在上一篇我们对工厂模式中的普通工厂模式有了一定的了解,其实抽象工作就是 表示针对 ...
- Python设计模式——建造者模式
需求,画人物,要求画一个人的头,左手,右手,左脚,右脚和身体,画一个瘦子,一个胖子 不使用设计模式 #encoding=utf-8 __author__ = 'kevinlu1010@qq.com' ...
- 浅谈Python设计模式 - 适配器模式
声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 从本篇便开始介绍结构型设计模式,而适配器设计模式便是该类设计模式的一种,那么什么 ...
随机推荐
- 基于zookeeper-3.5.5安装hadoop-3.1.2
目录 目录 1 1. 前言 3 2. 缩略语 3 3. 安装步骤 4 4. 下载安装包 4 5. 机器规划 4 6. 设置批量操作参数 5 7. 环境准备 5 7.1. 修改最大可打开文件数 5 7. ...
- connect ECONNREFUSED 127.0.0.1:80错误解决
这个报错也是一直困扰了我许久,服务端一直打印这个报错,但是页面数据响应又都正常,起初真不知道是因为什么原因,能看出来他是在调用80端口, 但是不明白为什么会调用80端口.一度以为是config.js里 ...
- 在eclipse中新建java问题报错:The type XXX cannot be resolved. It is indirectly referenced from required .class files
在Eclipse中遇到The type XXX cannot be resolved. It is indirectly referenced from required .class files错误 ...
- C函数之readlink
函数原型; #include<unistd.h> ssize_t readlink(const char *path, char *buf, size_t bufsiz); 函数说明: r ...
- parameter与argument,property与attribute
本文摘自:https://blog.csdn.net/Zhangxichao100/article/details/59484133 parameter与argument,property与attri ...
- 读懂 ECMA 规格
一般我们都不关心 ECMA 规范,只需要学习怎么使用就好了.但有时候遇到一些难以解释的问题/现象,就不得不看一下规范是如何要求实现的了.规范内容庞杂,理解其中的术语有利于我们快速看懂规范. Envir ...
- SQLServer --------- 将sql脚本文件导入数据库
创建数据库方法有两种 第一种通过图形化的操作界面 第二种通过 sql 语句 sql server 如何执行.sql 文件,的原理就是执行sql语句进行创建 打开数据库后找到 最左侧文件 找到需要执 ...
- sublime text 开发记录贴
1.展示信息有两种: self.view.show_popup('hello'), 这个好看点. sublime.status_message('ssss') sublime.error_mes ...
- MD5加盐与安全
PHP开发者对md5()这个函数是熟悉不过了,很多开发者都使用md5('abc123')对用户密码进行加密处理,这样做没有错,但是安全性还是很低的,因为很多网站的用户数据都是用md5进行加密处理的,所 ...
- Excel批量添加不同的批注
Sub 批量添加不同批注() Dim rng As Range Dim i As String Range("A1:D1").ClearComments For Each rng ...