设计模式之Builder

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

Builder模式定义:
     将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.

     Builder模式是一步一步创建一个复杂的对象,它允许用户可以只通过指定复杂对象的类型和内容就可以构建它们.用户不知道内部的具体构建细节.

 

如何使用?
首先假设一个复杂对象是由多个部件组成的,Builder模式是把复杂对象的创建和部件的创建分别开来,分别用Builder类和Director类来表示.

首先,需要一个接口,它定义如何创建复杂对象的各个部件:

public interface Builder {

  //创建部件A  比如创建汽车车轮
  void buildPartA(); 
  //创建部件B 比如创建汽车方向盘
  void buildPartB(); 
  //创建部件C 比如创建汽车发动机
  void buildPartC();

  //返回最后组装成品结果 (返回最后装配好的汽车)
  //成品的组装过程不在这里进行,而是转移到下面的Director类中进行.
  //从而实现了解耦过程和部件
  Product getResult();


 

用Director构建最后的复杂对象,而在上面Builder接口中封装的是如何创建一个个部件(复杂对象是由这些部件组成的),也就是说Director的内容是如何将部件最后组装成成品:

public class Director {

  private Builder builder;

  public Director( Builder builder ) { 
    this.builder = builder; 
  } 
  // 将部件partA partB partC最后组成复杂对象
  //这里是将车轮 方向盘和发动机组装成汽车的过程
  public void construct() { 
    builder.buildPartA();
    builder.buildPartB();
    builder.buildPartC();

  }


 

Builder的具体实现ConcreteBuilder:
通过具体完成接口Builder来构建或装配产品的部件;
定义并明确它所要创建的是什么具体东西;
提供一个可以重新获取产品的接口:

public class ConcreteBuilder implements Builder {

  Part partA, partB, partC; 
  public void buildPartA() {
    //这里是具体如何构建partA的代码

  }; 
  public void buildPartB() { 
    //这里是具体如何构建partB的代码
  }; 
   public void buildPartC() { 
    //这里是具体如何构建partB的代码
  }; 
   public Product getResult() { 
    //返回最后组装成品结果
  };

}
 

复杂对象:产品Product:

public interface Product { } 
 

复杂对象的部件:

public interface Part { }
 


我们看看如何调用Builder模式:
ConcreteBuilder builder = new ConcreteBuilder();
Director director = new Director( builder );

director.construct(); 
Product product = builder.getResult();

 

转载于:https://my.oschina.net/u/219582/blog/59453

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

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

相关文章

linux kvm系统,linux kvm虚拟机安装以及主机配置支持有哪些?如何远程控制linux kvm系统?...

服务器安装kvm的时候,如果没有安装桌面(一般不会安装,节省资源),就需要使用命令去创建虚拟机。要支持 KVM,Intel CPU需要 vmx 或者 AMD CPU 需要svm 扩展。在linux系统上使用kvm虚拟化系统需要对主机开启虚拟化,并做一些基础设置,…

C# 答群友:把窗体应用改成类库输出然后去引用

类库你就新建类库文件直接生成dll去引用好了,但是群友非要骚操作,新建一个windows窗体把他搞成dll去引用,当时我回答了这个问题是可以的,但是实际上我没有这么干过,今天恰好有空,体验了一把,的确…

麻省理工告诉我们男女配对的真相!

全世界有3.14 % 的人已经关注了数据与算法之美该实验出自麻省理工学院著名经济学家Dan Ariely的《The Upside of Irrationality》。其结果很有趣,也在我们的生活中尤为常见。Part 1.实验人员找来100位正值青春年华的大学生。男女各半。然后制作了100张卡片&#xff…

查看linux的计划任务日志,查看计划任务日志(共5篇).docx

查看计划任务日志(共5篇)沈阳工程学院  学生实验报告  实验室名称:信息学院网络安全实验室  实验课程名称:网络安全技术  实验项目名称:实验六日志查看与清除实验  班级:姓名:学号:  实验日期&…

ios启动画面

iOS设备现在有三种不同的分辨率:iPhone 320x480、iPhone 4 640x960、iPad 768x1024。以前程序的启动画面(图片)只要准备一个 Default.png 就可以了,但是现在变得复杂多了。下面就是 CocoaChina 会员做得总结 如果一个程序,既支持iPhone又支持…

快速排序的性能和名字一样优秀

前言上次分享的冒泡排序虽然比较简单、容易理解,但每一次冒泡的过程都需要依次比较相邻的元素,然后交换,可见性能还是有很大的优化空间,只要能减少比较次数,性能自然就上去啦;快速排序便是一个很不错的选择…

资料分享 | 教程与开发手册资料分享来袭

小编从大学开始,便开启资料收集功能。随着科技时代的不断发展,计算机语言发展进入新的阶段,再加上日常的深入研究,小编收集整理了丰富的计算机语言学习资料,内容涵盖“教程与开发手册”,“js资料”、“PHP编…

Linux下ms软件,在linux下有没有什么软件可以连接windows上的MSSQL SERVER

在linux下有没有什么软件可以连接windows上的MSSQL SERVERGUI的http://dbeaver.jkiss.org/http://bbs.csdn.net/topics/391014331https://github.com/serge-rider/dbeaverhttps://github.com/serge-rider?tabrepositories在Linux(UNIX)下连接MS SQLserver的方法http://blog.cs…

你可能会用到的 Mock 小技巧

你可能会用到的 Mock 小技巧Intro最近看到阿迪分享了两篇 Mock 相关的文章,于是想把自己遇到的一些可能对你有帮助的一些小技巧分享一下,大概总结了一下,且看下文AsyncEnumerable在 C# 8 中引入了异步流,AsyncEnumerable&#xff…

Mangos源码分析(2):服务器结构探讨之登录服的负载均衡

回想一下我们在玩wow时的操作流程:运行wow.exe进入游戏后,首先就会要求我们输入用户名和密码进行验证,验证成功后才会出来游戏世界列表,之后是排队进入游戏世界,开始游戏...  可以看到跟前面的描述有个很明显的不同&…

备受期待的Python深度学习来了

在这个酣畅淋漓的暑假结束后,深度学习的四大名著之一漂洋过海来见中国的程序员们啦,豆瓣评分9.5分的《Deep Learning with Python》,推出中译版——《Python深度学习》Deep Learning with PythonPython深度学习扫码购买优惠近30元&#xff01…

安装linux6.10 I386系统教程,一看就懂的Centos6.10安装教程

第一步将虚拟机安装完毕后,运行虚拟机进行到这个界面下(虚拟机安装及其配置,详见论坛内的博客分享在这就不在陈述),:出现的是5条英文由上到下以此分别为:1.安装或升级2.基本的显卡驱动来安装系统(在有些操作系统无法识…

批量修改远程linux服务器密码

一、建立信任关系 192.168.9.203 为管理机 192.168.9.201 192.168.9.202 为远程linux服务器 1、在管理机生成证书、 [rootmanage ~]# ssh-keygen -t rsa复制代码Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Enter pas…

计算机是怎么知道两张图片相似的呢?

全世界有3.14 % 的人已经关注了数据与算法之美很多搜索引擎可以用一张图片,搜索互联网上所有与它相似的图片。你输入网片的网址,或者直接上传图片,Google就会找出与其相似的图片。下面这张图片是美国女演员Alyson Hannigan。上传后&#xff0…

WPF实现下拉框带图文和水印

WPF开发者QQ群&#xff1a; 340500857 有小伙伴需要实现ComboBox下拉框带水印&#xff0c;并且选择Item内容后水印默认从中间到顶部。Item需要展示图文&#xff0c;选择后的数据展示图文。欢迎转发、分享、点赞&#xff0c;谢谢大家~。效果如下&#xff1a;一、Xaml代码如下<…

linux 7.0查看防火墙状态,centos7查看防火墙状态

查看防火墙状态[rootVM_0_3_centos /]# firewall-cmd --statenot running[rootVM_0_3_centos /]# sudo systemctl status firewalld● firewalld.service - firewalld - dynamic firewall daemonLoaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor …

Google第一女神李飞飞,从洗碗工蜕变成为首席科学家

全世界有3.14 % 的人已经关注了数据与算法之美最近这几天&#xff0c;5岁孩子简历事件刷爆了朋友圈。批阅完朋友圈的文章&#xff0c;超模君心好累。别人家的孩子5岁已经每周3篇英语日记&#xff0c;而5岁我却还在玩泥巴&#xff0c;终于明白什么叫输在起跑线上了。即便输在了起…

如何注册java程序为windows服务

最近想找个软件来控制电脑的关机时间&#xff0c;在网上找了几个&#xff0c;都是可视化界面的可以设置具体的关机时间的软件。由于我想编写的关机程序是运行在别人机器上&#xff0c;只能让该机器在晚上17 点到23 点25 分才上网&#xff0c;到了23 点25 分就可以自动关机。为了…

通过Dapr实现一个简单的基于.net的微服务电商系统(九)——一步一步教你如何撸Dapr之OAuth2授权...

Oauth2授权&#xff0c;熟悉微信开发的同学对这个东西应该不陌生吧。当我们的应用系统需要集成第三方授权时一般都会做oauth集成&#xff0c;今天就来看看在Dapr的语境下我们如何仅通过配置无需修改应用程序的方式让第三方服务保护我们的API应用。目录&#xff1a;一、通过Dapr…

linux创建备用管理员,sql server 创建备用管理员和只读用户

-----------------------------------------------------------------------创建新的登录名use mastergoexec sp_addlogin loginame mysa , passwd 11goexec sp_addlogin loginame read , passwd 11go--修改密码--exec sp_password old null , new sa , loginame sa--exec…