声明:本系列文章主要参考《精通Python设计模式》一书,并且参考一些资料,结合自己的一些看法来总结而来。

  建造者模式

  当我们想要创建一个由多个部分构成的对象,而且他们的构建需要一步接一步的地完成,只有当各个部分都创建好,这个对象才算完整。 -- 这正是 建造者设计模式的用武之地。

  根据《精通Python设计模式》介绍,建造者模式通常用于补充工厂模式的不足,尤其是在如下场景中:

  1. 要求一个对象有不同的表现,并且希望将对象的构造与表现解耦。
  2. 要求在某个时间点创建对象,但在稍后的时间点再访问。

  个人理解:

 由于之前介绍了工厂模式,这边拿创建者模式进行对比下:

  工厂模式像是从某宝输入 电脑的关键字 直接进行购买,获得一个已经完整的电脑。而创建者模式,更像是 找个一个电脑的外壳,往该外壳内一步一步的组装零件,最后得到一个完整的电脑。

  应用场景:

  最常用的一个场景就是操作数据库的 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设计模式 - 建造者模式的更多相关文章

  1. 浅谈Python设计模式 - 外观模式

    声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 外观模式 外观模式的核心在于将复杂的内部实现包装起来,只向外界提供简单的调用接口 ...

  2. 浅谈Python设计模式 - 代理模式

    声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 一.在某些应用中,我们想要在访问某个对象之前执行一个或者多个重要的操作,例如,访 ...

  3. 浅谈Python设计模式 - 工厂模式

    声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 工厂模式: 顾名思义,工厂则是根据提供的不同的材料,生产出不同的产品.那么在编程 ...

  4. 浅谈Python设计模式 - 原型模式

    声明,本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 在<精通Python设计模式>中把设计模式分为三种类型: 创建型模式 ...

  5. 浅谈Python设计模式 -- 责任链模式

    声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 之前在最开始就聊了Python设计模式有三种,其中关于创建型和结构型设计模式基本 ...

  6. 浅谈Python设计模式 - 享元模式

    声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 享元模式: 享元模式是一种用于解决资源和性能压力时会使用到的设计模式,它的核心思 ...

  7. 浅谈Python设计模式 - 抽象工厂模式

    声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 在上一篇我们对工厂模式中的普通工厂模式有了一定的了解,其实抽象工作就是 表示针对 ...

  8. Python设计模式——建造者模式

    需求,画人物,要求画一个人的头,左手,右手,左脚,右脚和身体,画一个瘦子,一个胖子 不使用设计模式 #encoding=utf-8 __author__ = 'kevinlu1010@qq.com' ...

  9. 浅谈Python设计模式 - 适配器模式

    声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 从本篇便开始介绍结构型设计模式,而适配器设计模式便是该类设计模式的一种,那么什么 ...

随机推荐

  1. 我对网络IO的理解

    Unix/Linux系统下IO主要分为磁盘IO,网络IO,我今天主要说一下对网络IO的理解,网络IO主要是socket套接字的读(read).写(write),socket在Linux系统被抽象为流( ...

  2. Java集合详解6:这次,从头到尾带你解读Java中的红黑树

    <Java集合详解系列>是我在完成夯实Java基础篇的系列博客后准备开始写的新系列. 这些文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查 ...

  3. VUE:页面跳转时传递参数,及参数获取

    https://www.cnblogs.com/zhongchao666/p/9679807.html https://blog.csdn.net/mf_717714/article/details/ ...

  4. 《Linux就该这么学》培训笔记_ch20使用LNMP架构部署动态网站环境

    <Linux就该这么学>培训笔记_ch20使用LNMP架构部署动态网站环境 文章最后会post上书本的笔记照片. 文章主要内容: 源码包程序 LNMP动态网站架构 配置Mysql服务 配置 ...

  5. kube-prometheus部署

    一.从git拉取相应yaml文件 git clone https://github.com/coreos/kube-prometheus.git 二.修改grafana及prometheus的serv ...

  6. (转)解决mybatis的mapper.xml查询不出数据,结果一直为null问题

    背景:记录mybatis使用过程中遇到的相关问题. 解决mybatis的mapper.xml查询不出数据,结果一直为null问题 解决方案: 1 修改实体类与数据库字段名相同 2 修改sql查询语句, ...

  7. 解决ios环境下点击输入框页面被顶起不能自动回弹到底部问题

    第一步:在标签的输入框中添加获取焦点事件  代码写法: @focus="getFocus" (vue代码)  可直接拷贝拿去放在自己页面元素中,如下: <div class= ...

  8. Oracle GoldenGate 同步数据至Hbase

    该方法没试过,先记下再说 1.软件版本说明: Goldengate 12c 12.2.0.1 for Oracle(源端) Goldengate 12c 12.3.0.1 for Bigdata (目 ...

  9. SQL Server ----- 还原数据库,将另一台电脑上的数据库装在本机

    1.创建好数据库,记住安装位置,,和需要还原的数据库的位置 还原数据库的意思就是 根据创建的数据库,还原备份的数据库,如果数据库中没有数据库要新建数据库. 2.进来后如图 3.找你需要的还原数据库的位 ...

  10. JavaSE 面试题: 类初始化和实例初始化等

    JavaSE 面试题 类初始化和实例初始化等 class Father { private int i = test(); private static int j = method(); stati ...