ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

建造者模式

2019-02-27 16:53:41  阅读:233  来源: 互联网

标签:String void 建造 模式 director human 造人 public


 在开始写这个建造者模式的文章前,我也确实看了挺多次其他介绍这个模式的文章。感觉看了很多次才有一点对建造者模式明白透彻的感觉。细心想来,可能是接口的理解不好,平时工作比较少用到过建造者模式,所以理解的比较慢。所以看通了建造者模式,就可以加深自己对接口的理解。

  好了,接下来让我们进入正题,建造者模式呢,很多其他介绍这个文章的内容中都提到了4个角色。什么builder,director的一时让同为初次了解到建造者模式的这个概念感受到困惑不已。后来看明白才发现,这些角色和我们开始理解建造者模式不是充分必要关系。我们完全可以等了解了建造者模式后才总结出这几个角色。所以我决定一开始先不扯这些概念性的东西,而是一步一步引导读者来揭开建造者模式的面纱。

  那从例子开始,建造者模式就是要造东西嘛,造点啥呢?我脑海中曾经一顿挣扎,什么,造汽车啊,大楼啊,电脑啊等等,后来发现还是简单点造个人吧。这样大家都好理解。读者也可以理解造机器人。只要你喜欢。

那我们新建一个人的类。

  1. public class Human {
  2. private String head;
  3. private String body;
  4. private String hand;
  5. private String foot;
  6. public String getHead() {
  7. return head;
  8. }
  9. public void setHead(String head) {
  10. this.head = head;
  11. }
  12. public String getBody() {
  13. return body;
  14. }
  15. public void setBody(String body) {
  16. this.body = body;
  17. }
  18. public String getHand() {
  19. return hand;
  20. }
  21. public void setHand(String hand) {
  22. this.hand = hand;
  23. }
  24. public String getFoot() {
  25. return foot;
  26. }
  27. public void setFoot(String foot) {
  28. this.foot = foot;
  29. }
  30. }

这个就是人的类了,我们取名为human。只要是人都是这个类出来的。

  那我们想要造人的话,得有一个标准吧?  来要造人的话得有一个步骤吧?头,身体,手,脚,那都得有。

所以我们先写一个接口。一个定义了造人标准的接口。

  1. public interface IBuildHuman {
  2. public void buildHead();
  3. public void buildBody();
  4. public void buildHand();
  5. public void buildFoot();
  6. public Human createHuman();
  7. }

  看,一个接口定义好了。有各种造部位的方法,最后给个createHuman方法给你返回一个我们想要造的人。

现在,人的类和造人的标准我们都定义好了。那我们可以先造一个人出来,先造一个高智商的人吧。

  1. public class SmartManBuilder implements IBuildHuman {
  2. Human human;
  3. public SmartManBuilder(){
  4. human = new Human();
  5. }
  6. @Override
  7. public void buildHead() {
  8. human.setHead("智商180的头脑");
  9. }
  10. @Override
  11. public void buildBody() {
  12. human.setBody("新的身体");
  13. }
  14. @Override
  15. public void buildHand() {
  16. human.setHand("新的手");
  17. }
  18. @Override
  19. public void buildFoot() {
  20. human.setFoot("新的脚");
  21. }
  22. @Override
  23. public Human createHuman() {
  24. return human;
  25. }
  26. }

  这个高智商的造人过程自然是实现了IBuildHuman这个造人标准的接口了。然后就是set方法,最后返回造好的human。

  好的,其实到这里呢,我们已经完成了建造的过程。那就这么简单的建造过程,还搞了一个建造模式吗?非也。接下来,就是介绍建造者模式的精髓,那就是director。这个director呢,就是来执行我们刚才的造人动作的。没错,精髓就是我们刚才的造人动作。我们先看代码:

  1. public class Director {
  2. public Human createHumanByDirecotr(IBuildHuman bh){
  3. bh.buildBody();
  4. bh.buildFoot();
  5. bh.buildHand();
  6. bh.buildHead();
  7. return bh.createHuman();
  8. }
  9. }

这个director类呢,重点在于createHumanByDirecotr的参数是我们的造人标准的接口。这样一来,只要是实现了我们的这个接口的类,就都可以作为参数,我们刚刚不是造了一个高智商的人吗?那我们如果想造一个身体运动能力出色的人,也就是运动员,这个director也可以启动这个造人过程,只要我们把这个运动员的类先写好。我们来看看director是如何发挥的:

  1. public class BuilderTest {
  2. public static void main(String[] args){
  3. Director director = new Director();
  4. Human human = director.createHumanByDirecotr(new SmartManBuilder());
  5. System.out.println(human.getHead());
  6. System.out.println(human.getBody());
  7. System.out.println(human.getHand());
  8. System.out.println(human.getFoot());
  9. }
  10. }

 输出结果为:

  1. 智商180的头脑
  2. 新的身体
  3. 新的手
  4. 新的脚

  看,createHumanByDirecotr这个方法带的参数就是我们高智商人的那个类。那我们想造一个运动员,就可以像高智商人那样建好类,然后传进来就可以了!

  建造者模式就是这样。那到最后,我们必须要思考一下为什么这么做?学而不思则罔,我们纵观全部代码,其实我们就会发现,在最后的BuilderTest类中,我们其实根本就不会知道具体是怎么造人的,因为这个过程让director给代劳了。然后,我们的SmartManBuilder类中才是真正的造人方法。director其实只是执行了这个过程。这样子,达到了分离模块的功能。造人的过程,启动造人的过程,和最后选择哪种人来造。都分的清清楚楚。就有了一些模块化的感觉,这样维护和扩展都是很方便的。所以设计模式的精髓还是那几个原则。感觉原则才是法则,而这么多模式就是具体的招式。今天的建造者模式就到这里。希望看到这里的你可以明白!谢谢!如果有问题,欢迎留言交流!

 

 

 

 

  

标签:String,void,建造,模式,director,human,造人,public
来源: https://blog.csdn.net/supper_me/article/details/87979288

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有