builder 模式

首先提出几个问题:

  • 什么是Builder模式?
  • 为什么要使用Builder模式?它的优点是什么,那缺点呢?
  • 什么情况下使用Builder模式?
    关于Builder模式在代码中用的很多,比如AlertDialog, OkHttpClient等。一提到模式感觉像是一个很牛的招式。用起来很炫。
    那先看看Builder是由什么组成,他的基本思想是什么
    这里写图片描述

从类图中可以看出Builder 有四个角色
- 抽象建造者(Builder)角色:给出一个抽象接口,以规范产品对象的各个组成成分的建造。该接口定义两种方法,一种方法是建造方法,一般来说, 产品所包含的零件数目与建造方法的数目相符。
- 具体创建者(Concrete Builder)角色: 担任这个角色的是与应用程序紧密相关的一些类,它们在应用程序调用下创建产品的实例。这个角色要完成的任务包括:1.实现抽象建造者Builder所生命的接口,给出一步一步地完成产品实例的操作。2.在建造过程完成后,提供产品的实例。
- 导演者(Director)角色, 担任这个角色的类调用具体建造者角色以创建产品对象。
- 产品(Product)角色:产品(Product)便是建造中的复杂对象。
回到前面的问题,为什么要使用建造模式呢

  • 一个对象会有一些重要的性质,在它们没有恰当的值之前,对象不能作为一个完成的产品使用。
  • 一个对象的一些性质必须按照某个顺序赋值才有意义。

    这个时候,此对象相当于一个有待建造的产品,而对象的
    些性质相当于产品的零件,建造茶品的过程是建造零件的过
    程。由于建造零件的过程很复杂,因此,这些零件的建造过
    程往往被“外部化”到另一个称为建造者的对象里,建造者对
    象返还给客户端的是一个全部零件都建造完毕的产品对象。

    那么在什么情况下才应该使用建造模式

  • 需要生成的产品对象有复杂的内部结构,每一个成分本身也可以是对象,也可以仅仅是对象的的一个组成成分。

  • 需要生成的产品对象的属性相互依赖。建造模式可以强制实行一种分步骤进行的建造过程。因此,如果产品对象的一个属性必须在另一个属性被赋值之后才可以被赋值,使用建造模式便是一个很好的设计思想。
  • 在对象创建过程中会使用到系统中的其他一些对象,这些对象在产品对象的创建过程中不易得到。

下面来看一下建造模式的优点

  • 建造模式的使用使得产品可以独立地变化。使用建造模式可以使客户端不必知道产品的内部组成的细节。
  • 每一个Builder都相对独立,而其他的Build无关。
  • 模式所建造的最终产品更容易于控制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/389113.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工作失职的处理决定_工作失职的处理决定

精品文档2016全新精品资料-全新公文范文-全程指导写作–独家原创1/3工作失职的处理决定失职是指工作人员对本职工作不认真负责,未依照规定履行自己的职务,致使单位或服务对象造成损失的行为。关于工作失职的处理决定该怎么写呢?下面学习啦小编给大家带来…

venn diagram_Venn Diagram Python软件包:Vennfig

venn diagram目录 (Table of Contents) Introduction 介绍 Installation 安装 Default Functions 默认功能 Parameters 参量 Examples 例子 Conclusion 结论 介绍 (Introduction) In the last article, I showed how to draw basic Venn diagrams using matplotlib_venn.在上一…

应用程序的主入口点应用程序的主入口点应用程序的主入口点

/// <summary>/// 应用程序的主入口点。/// </summary>[STAThread]static void Main(string[] args){Stream stream Assembly.GetExecutingAssembly().GetManifestResourceStream("CapApp.TestApp.exe");byte[] bs new byte[stream.Length];stream.Rea…

创梦天地通过聆讯:上半年经营利润1.3亿 腾讯持股超20%

雷帝网 雷建平 11月23日报道时隔半年后&#xff0c;乐逗游戏母公司创梦天地终于通过上市聆讯&#xff0c;这意味着创梦天地很快将在港交所上市。创梦天地联合保荐人包括瑞信、招商证券国际、中金公司。当前&#xff0c;创梦天地运营的游戏包括《梦幻花园》、《快乐点点消》、《…

PyCharm之python书写规范--消去提示波浪线

强迫症患者面对PyCharm的波浪线是很难受的&#xff0c;针对如下代码去除PyCharm中的波浪线&#xff1a; # _*_coding:utf-8_*_ # /usr/bin/env python3 A_user "lin" A_password "lin123"for i in range(3): # 循环次数为3name input("请输入你的…

关于java static 关键字

当我们创建类时会指出哪个类的对象的外观与行为。 一般的流程是用new 创建这个类的对象&#xff0c;然后生成数据的存储空间&#xff0c;并使用相应的方法。 但以下两种情况不太适合这个流程&#xff1a; 只想用一个存储区域来保存一个特定的数据—–无论要创建多少个对象&a…

plotly django_使用Plotly为Django HTML页面进行漂亮的可视化

plotly djangoHello everyone! Recently I had to do some visualizations for my university project, I’ve done some googling and haven’t found any simple guides on how to put Plotly plots on an HTML page.大家好&#xff01; 最近&#xff0c;我不得不为我的大学项…

roce和iwarp_VIA、IB、RDMA、RoCE、iWARP、DPDK的发展与纠缠?

VIA(Virtual Interface Architecture): 这个只是一个标准&#xff0c;基本上不要了解太多。楼主的问题可以细分成2个层次考虑。一个是网络环境&#xff0c;二是具体的协议和实现。一、网络环境IB(InfiniBand): 是一种网络环境&#xff0c;做对比的是以太网, IB往往用于高性能集…

remoting

原文地址&#xff1a;http://blog.csdn.net/chengking/archive/2005/10/26/517349.aspx (一).说明 一个远程调用示例. 此示例实现功能: 客房端调用远程方法&#xff08;远程方法可以弹 出自定义信息&#xff09;&#xff0c;实现发送信息功能. 实现原理概是这样的…

handler 消息处理机制

关于handler消息处理机制&#xff0c;只要一提到&#xff0c;相信作为一个android工程师&#xff0c;脑海就会有这么一个流程 大家都滚瓜烂熟了&#xff0c;但别人问到几个问题&#xff0c;很多人还是栽到这个“烂”上面&#xff0c;比如&#xff1a; 一个线程是如何对应一个L…

es6简单介绍

let和const 原先声明变量的形式 var test 5; //全局变量 function a() {var cc3; //局部变量alert(test); } function b(){alert(test);}test 5;//全局变量 function a() {aa3; //全局变量alert(test); } 在es6之前&#xff0c;作用域只有全局作用域和函数作用域&#xff0…

软件工程方法学要素含义_日期时间数据的要素工程

软件工程方法学要素含义According to Wikipedia, feature engineering refers to the process of using domain knowledge to extract features from raw data via data mining techniques. These features can then be used to improve the performance of machine learning a…

洛谷P1605:迷宫(DFS)

题目背景 迷宫 【问题描述】 给定一个N*M方格的迷宫&#xff0c;迷宫里有T处障碍&#xff0c;障碍处不可通过。给定起点坐标和终点坐标&#xff0c;问: 每个方格最多经过1次&#xff0c;有多少种从起点坐标到终点坐标的方案。在迷宫中移动有上下左右四种方式&#xff0c;每次只…

vue图片压缩不失真_图片压缩会失真?快试试这几个无损压缩神器。

前端通常在做网页的时候 会出现图片加载慢的情况 在这里我通常会将图片进行压缩 但是通常情况下 观众会认为 图片压缩会出现失真的现象 在这里我会向大家推荐几款图片压缩的工具 基本上会实现无损压缩1.TinyPng地址&#xff1a;https://tinypng.comEnglish&#xff1f;不要慌&a…

remoteing2

此示例主要演示了net remoting,其中包含一个服务器程序Server.exe和一个客户端程序CAOClient.exe。客户端程序会通过http channel调用服务器端RemoteType.dll的对象和方法。服务器端的代码文件由下图所述&#xff1a;Server.cs源代码 :using System;using System.Runtime.Remot…

android 线程池

为什么用线程池 创建/销毁线程伴随着系统开销&#xff0c;过于频繁的创建/销毁线程&#xff0c;会很大程度上影响处理效率 例如&#xff1a; 记创建线程消耗时间T1&#xff0c;执行任务消耗时间T2&#xff0c;销毁线程消耗时间T3 如果T1T3>T2&#xff0c;那么是不是说开…

datatable转化泛型

public class ConvertHelper<T>where T:new() { /// <summary> /// 利用反射和泛型 /// </summary> /// <param name"dt"></param> /// <returns></returns> public static List<T> ConvertToList(DataTable dt) { …

【跃迁之路】【651天】程序员高效学习方法论探索系列(实验阶段408-2018.11.24)...

(收集箱&#xff08;每日一记&#xff0c;每周六整理&#xff09;)专栏 实验说明 从2017.10.6起&#xff0c;开启这个系列&#xff0c;目标只有一个&#xff1a;探索新的学习方法&#xff0c;实现跃迁式成长实验期2年&#xff08;2017.10.06 - 2019.10.06&#xff09;我将以自己…

更换mysql_Docker搭建MySQL主从复制

Docker搭建MySQL主从复制 主从服务器上分别安装Docker 1.1 Docker 要求 CentOS 系统的内核版本高于 3.10 [rootlocalhost ~]# uname -r 3.10.0-693.el7.x86_641.2 确保 yum 包更新到最新。 [rootlocalhost ~]# sudo yum update Loaded plugins: fastestmirror, langpacks Loadi…

dll文件的c++制作dll文件的c++制作

dll文件的c制作1、首先用vs2005建立一个c的dll动态链接库文件&#xff0c;这时&#xff0c;// DllTest.cpp : 定义 DLL 应用程序的入口点。//#include "stdafx.h"//#include "DllTest.h"#ifdef _MANAGED#pragma managed(push, off)#endifBOOL APIENTRY Dll…