设计模式学习--Buider pattern(创建者模式)

来源:互联网 发布:美国代购淘宝推荐 编辑:程序博客网 时间:2024/04/30 21:22

Builder模式很简单,但是一直想不明白为什么要这么设计

找到一个很好的文章

简单地说,就好象我要一座房子住,可是我不知道怎么盖(简单的砌墙,层次较低),也不知道怎么样设计(建几个房间,几个门好看,层次较高),于是我需要找一帮民工,他们会砌墙,还得找个设计师,他知道怎么设计,我还要确保民工听设计师的领导,而设计师本身也不干活,光是下命令,这里砌一堵墙,这里砌一扇门,这样民工开始建设,最后,我可以向民工要房子了。在这个过程中,设计师是什么也没有,除了他在脑子里的设计和命令,所以要房子也是跟民工要,记住了!

1,定义工人接口
,就是能够完成建造房子任务的人的通用要求。

java 代码
  1. // 工人接口,定义了各个工人所要进行的工所作。他们负责进行具体部件如窗户,地板的建造。
  2. // 同时因为房子是民工建的,因此建设完成后由他把房子递交回房主
  3. public interface Builder {  
  4.     
  5.   public  void makeWindow();  
  6.   
  7.   public  void makeFloor();  
  8.   
  9.   public  Room  getRoom();  
  10. }  

2,定义设计师,他的职责是指挥房主指派给他的工人按照自己的设计意图建造房子。
java 代码
  1. // 设计师。他知道房子应该怎么设计,但他不会自己去建造,而是指挥民工去建造。  
  2. public class Designer {  
  3.   
  4.   // 指挥民工进行工作  
  5.   public void order(Builder  builder) {  
  6.     builder.makeWindow();  
  7.     builder.makeFloor();  
  8.   }  
  9. }  

3,民工,他负责具体事物的实施。
java 代码
  1. // 民工。负责进行具体部件如窗户,地板的建造。
  2. //同时因为房子是民工建的,因此建设完成后由他把房子递交回房主  
  3. public class Mingong  implements Builder {  
  4.   private  String window="";  
  5.   private  String floor="";  
  6.     
  7.   public  void makeWindow() {  
  8.     window=new String("window");  
  9.   }  
  10.   
  11.   public  void makeFloor(){  
  12.     floor=new String("floor");  
  13.   }  
  14.    
  15.   // 回交房子给房主  
  16.   public  Room  getRoom() {  
  17.     if((!window.equals(""))&&(!floor.equals(""))) {  
  18.       System.out.println("room ready!");  
  19.       return new Room();  
  20.     }  
  21.     else return null;  
  22.   }  
  23. }  

4,房主,就是雇人,收房。
java 代码
 
  1. // 房主。房主的任务就是聘请一个民工,一个设计师,同时把民工给设计师指挥,督促设计师开展工作。最后从民工手上收房。    
  2. public class Client {    
  3.     
  4.   public static void main(String[] args) {    
  5.      Builder mingong = new Mingong();    
  6.      Designer  designer = new  Designer();    
  7.      designer.order(mingong);    
  8.      mingong.getRoom();    
  9.   }    
  10. }   

为什么要使用Builder模式,适用于哪些场景?

Builder 的目的是把一个比较复杂的对象的构建封装到一个单独的Builder里面


为什么弄个director出来,直接在builder中声明一个builderRoom方法有什么缺点?
一是单一职责的问题,builder被认为是制作零部件的,director被认为是组装的.
二是建造一个房子假设不需要天花板,需要变动的是director而不是builder,也就是将零部件的build与组装解偶.


另外一个应用场景:

这天,Y先生正在工作,突然Q女士来电话了:“老公,家里的电脑坏了,好像得重新安装系统!”

Y先生最怕重装系统,他只好说:“老婆,等我下班回家再给你装吧,太麻烦了,怕你弄不好。”

Q女士:怎么重装系统这么麻烦吗?好吧,晚上你早点回来。

晚上,Y先生和Q女士坐在电脑前,Y先生首先备份了需要的数据,然后使用光盘安装系统,格式化,安装,安装驱动。。。。。

终于1个小时以后,系统安装完毕!

Y先生擦了擦汗:好了,终于弄完了。

Q女士:这么麻烦啊,,,可是以后如果电脑再出问题,我想自己安装系统怎么办呢?

Y先生想了想,恩,这我可得想想办法。看来我们需要做一件复杂的事情(安装系统),以及如何去执行这个复杂的事情。

好吧,我们先来创建一个东西去做复杂的事情:

java 代码
  1. public interface ISysInstallBuilder {   
  2.        
  3.     public void backupdata();   
  4.     public void formatDisk();   
  5.     public void copyData();   
  6.     public void installUsefulTool();   
  7.        
  8. }   

Y先生:这是一个接口,下面我来实现安装windows xp 的实现:

java 代码
  1. public class WinXpInstallBuilder implements ISysInstallBuilder {   
  2.   
  3.     public void backupdata() {   
  4.         // TODO Auto-generated method stub  
  5.     }   
  6.   
  7.     public void formatDisk() {   
  8.         // TODO Auto-generated method stub  
  9.     }   
  10.   
  11.     public void copyData() {   
  12.         // TODO Auto-generated method stub  
  13.     }   
  14.   
  15.     public void installUsefulTool() {   
  16.         // TODO Auto-generated method stub  
  17.     }   
  18.   
  19. }  

Q女士:嗯,通过这个类我就能安装系统了:

java 代码
  1. public static void main(String[] args) {   
  2.     WinXpInstallBuilder builder = new WinXpInstallBuilder();   
  3.     builder.backupdata();   
  4.     builder.copyData();   
  5.     builder.formatDisk();   
  6.     builder.installUsefulTool();   
  7.        
  8. }  

Y先生:你看,你弄错了吧!格式化应该在复制数据之前。先别急,看看下面的:

java 代码
  1. public class SysInstallDirector {  
  2.     private ISysInstallBuilder builder;   
  3.     public SysInstallDirector(ISysInstallBuilder builder) {   
  4.         // TODO Auto-generated constructor stub  
  5.            
  6.         this.builder = builder;   
  7.     }   
  8.        
  9.     public void installSystem() {   
  10.            
  11.         builder.backupdata();   
  12.         builder.formatDisk();   
  13.         builder.copyData();   
  14.         builder.installUsefulTool();   
  15.     } 
  16. }  

Q 女士:嗯,我明白你的意思了,我以后就用这个类来安装系统就行了,对吧:

java 代码
  1. public static void main(String[] args) {   
  2.        
  3.     SysInstallDirector director = new SysInstallDirector(   
  4.                         new WinXpInstallBuilder());   
  5.     director.installSystem();   
  6.        

Q女士:嗯,这样当我做这件复杂的事情的时候时,就不怕把它弄错了!


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 舌头尖起泡很痛怎么办 舌头上起泡怎么办很疼 月经来了二十多天还不干净怎么办 三岁宝宝缺锌怎么办 无舌苔,舌头很红怎么办 嘴唇上肿了一块怎么办 下嘴唇突然肿了怎么办 上嘴唇突然肿厚怎么办 舌尖上火了好疼怎么办 舌头针扎似的疼怎么办 手麻了怎么办小妙招 月子生气奶少了怎么办 颈椎会引起脸麻怎么办 脑梗引起的手麻怎么办 着凉引起的腰疼怎么办 受凉引起的腰疼怎么办 着凉了腰疼厉害怎么办 腰疼压迫神经腿麻木怎么办 运动后小腿变粗怎么办 跑步后小腿变粗怎么办 嘴腮里面肉肿了怎么办 左胳膊左腿发麻怎么办 右胳膊和右腿麻怎么办 站久了腿肿胀疼怎么办 坐电脑前脖子疼怎么办 一做颈椎就疼怎么办 出了月子腿疼怎么办 坐久了屁股麻木怎么办 搬东西把腰扭了怎么办 蹲时间长了脚麻怎么办 马桶坐久了腿麻怎么办 睡觉手麻怎么办小妙招 手麻了怎么办小妙招吗 腰疼的不能动怎么办 三岁宝宝腿抽筋怎么办 腿抽筋后一直疼怎么办 小腿筋疼怎么办腿无力 小腿里面的筋疼怎么办 腿抽筋,第二天疼怎么办 脚肿了怎么办消肿止痛 颈椎压迫神经手麻怎么办