建造者模

Builder模式,将产品的内部表象和产品的生成过程分割开来,从而使一个建造过程生成具有不同的内部

表象的产品对象。建造模式使得产品内部表象可以独立的变化,客户不必知道产品内部组成的细节。建造模式可以强制实行一种分步骤进行的建造过程。

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示

相关模式:思路和模板方法模式很像,模板方法是封装算法流程,对某些细节,提供接口由子类修改,建造者模式更为高层一点,将所有细节都交由子类实现。

建造者模式的使用情况:

以下情况应当使用建造者模式:

1、需要生成的产品对象有复杂的内部结构。

2、需要生成的产品对象的属性相互依赖,建造者模式可以强迫生成顺序。

3、 在对象创建过程中会使用到系统中的一些其它对象,这些对象在产品对象的创建过程中不易得到。

优缺点:

优点:1、建造者模式的使用使得产品内部表象可以独立的变化,使客户端不必知道产品内部组成细节。

 2、每一个Builder都相对独立,而与其它的Builder无关。

 3、可以使对构造过程更加精细控制,以降低控制细节的风险。

4、将构建代码和表示代码分开。

缺点:1、由于其的变化点在于对象创建的细节,故其也难于分步骤构建的算法需求的变动,因为其关注的是对象创建顺序。

建造者模式一般适用于稳定的系统,比如说同样是对人的描述,如果描述的是正常人,就可用,但是对于残疾人,因为系统不再稳定,再使用的话就无法满足“开闭原则”了。


当要生产的一种产品具有相同的结构,并且每个构件的生产都很繁杂,就可以用Builder模式将具体构件的生产与整个成品的组装分离开来。还是拿本文的代码来举例,生产一台笔记本,笔记本的厂家不需要知道CPU怎么生产的,不需要关心内存怎么生产的,也不需要关心主板怎么生产的等。当他在生产一台笔记本的时候,只会说,我要一块Intel的CPU,于是就有了CPU(至于Intel的CPU怎么生产的他不关心,他只要一个CPu),他又说我要一块金士顿内存,于是就有了金士顿内存,这样直到他得到了所有的构件,然后他把这些构件组装起来,组成一台笔记本卖给客户。这就是一个典型的Builder模式。下面是代码:


[java]  view plain  copy
  1. /** 
  2.  * CPU抽象类 
  3.  */  
  4. public abstract class CPU {  
  5.     public abstract CPU getCPU();  
  6. }  

[java]  view plain  copy
  1. /** 
  2.  * Intel的cpu 
  3.  */  
  4. public class IntelCPU extends CPU {  
  5.   
  6.     public IntelCPU(){};  
  7.       
  8.     @Override  
  9.     public CPU getCPU() {  
  10.         // TODO Auto-generated method stub  
  11.         return new IntelCPU();  
  12.     }  
  13.       
  14.      public String toString(){    
  15.             return " IntelCPU ";    
  16.         }    
  17. }  

[java]  view plain  copy
  1. /** 
  2.  * AMD的cpu  
  3.  */  
  4. public class AMDCPU extends CPU {  
  5.   
  6.     public AMDCPU(){};  
  7.     @Override  
  8.     public CPU getCPU() {  
  9.         // TODO Auto-generated method stub  
  10.         return new AMDCPU();  
  11.     }  
  12.       
  13.      public String toString(){    
  14.             return " AMDCPU ";    
  15.         }    
  16.   
  17. }  

[java]  view plain  copy
  1. /** 
  2.  * 内存抽象类 
  3.  */  
  4. public abstract class Memory {  
  5.     public abstract Memory getMemory();  
  6. }  

[java]  view plain  copy
  1. /** 
  2.  * 金士顿内存 
  3.  */  
  4. public class KingstonMemory extends Memory {  
  5.     public KingstonMemory(){};  
  6.     @Override  
  7.     public Memory getMemory() {  
  8.         return new KingstonMemory();  
  9.     }  
  10.       
  11.      public String toString(){    
  12.             return " KingstonMemory ";    
  13.         }    
  14. }  

[java]  view plain  copy
  1. /** 
  2.  * 宇瞻内存 
  3.  */  
  4. public class ApacerMemory extends Memory {  
  5.     public ApacerMemory(){};  
  6.     @Override  
  7.     public Memory getMemory() {  
  8.         // TODO Auto-generated method stub  
  9.         return new ApacerMemory();  
  10.     }  
  11.       
  12.     public String toString(){    
  13.         return " ApacerMemory ";    
  14.     }    
  15. }  

[java]  view plain  copy
  1. **  
  2.  * 主板抽象类  
  3.  */  
  4. public abstract class Mainboard {  
  5.     public abstract Mainboard getMainboard();  
  6. }  


[java]  view plain  copy
  1. /** 
  2.  * 华硕主板 
  3.  */  
  4. public class AsusMainboard extends Mainboard {  
  5.     public AsusMainboard(){};  
  6.     @Override  
  7.     public Mainboard getMainboard() {  
  8.         // TODO Auto-generated method stub  
  9.         return new AsusMainboard();  
  10.     }  
  11.       
  12.     public String toString(){    
  13.         return " AsusMainboard ";    
  14.     }    
  15. }  

[java]  view plain  copy
  1. /** 
  2.  * 技嘉主板 
  3.  */  
  4. public class GaMainboard extends Mainboard {  
  5.     public GaMainboard(){}  
  6.   
  7.     @Override  
  8.     public Mainboard getMainboard() {  
  9.         return new GaMainboard();  
  10.     };  
  11.       
  12.      public String toString(){    
  13.             return " GaMainboard ";    
  14.         }    
  15. }  

[java]  view plain  copy
  1. /** 
  2.  * 计算机所需组件 
  3.  */  
  4. public class Computer {  
  5.     private CPU cpu;  
  6.     private Memory memory;  
  7.     private Mainboard mainboard;  
  8.     public CPU getCpu() {  
  9.         return cpu;  
  10.     }  
  11.     public void setCpu(CPU cpu) {  
  12.         this.cpu = cpu;  
  13.     }  
  14.     public Memory getMemory() {  
  15.         return memory;  
  16.     }  
  17.     public void setMemory(Memory memory) {  
  18.         this.memory = memory;  
  19.     }  
  20.     public Mainboard getMainboard() {  
  21.         return mainboard;  
  22.     }  
  23.     public void setMainboard(Mainboard mainboard) {  
  24.         this.mainboard = mainboard;  
  25.     }  
  26. }  


[java]  view plain  copy
  1. /** 
  2.  * 计算机Builder 
  3.  */  
  4. public interface ComputerBuilder {  
  5.     public void buildCPU();    
  6.     public void buildMemory();    
  7.     public void buildMainboard();    
  8.     public Computer getComputer();   
  9. }  

[java]  view plain  copy
  1. /** 
  2.  * 联想计算机Builder 
  3.  */  
  4. public class LenoveComputerBuilder implements ComputerBuilder {  
  5.      private Computer lenoveComputer=null;    
  6.         public LenoveComputerBuilder(){    
  7.             lenoveComputer=new Computer();    
  8.         }    
  9.       
  10.     @Override  
  11.     public void buildCPU() {  
  12.         lenoveComputer.setCpu(new IntelCPU());  
  13.     }  
  14.   
  15.     @Override  
  16.     public void buildMemory() {  
  17.         lenoveComputer.setMemory(new KingstonMemory());  
  18.     }  
  19.   
  20.     @Override  
  21.     public void buildMainboard() {  
  22.         lenoveComputer.setMainboard(new AsusMainboard());  
  23.     }  
  24.   
  25.     @Override  
  26.     public Computer getComputer() {  
  27.         buildCPU();    
  28.         buildMemory();    
  29.         buildMainboard();    
  30.         return lenoveComputer;  
  31.     }  
  32.   
  33. }  

[java]  view plain  copy
  1. /** 
  2.  * 惠普计算机Builder 
  3.  */  
  4. public class HPComputerBuilder implements ComputerBuilder {  
  5.      private Computer HPComputer=null;    
  6.     public HPComputerBuilder(){  
  7.         HPComputer = new Computer();  
  8.     }  
  9.       
  10.     @Override  
  11.     public void buildCPU() {  
  12.         HPComputer.setCpu(new AMDCPU());  
  13.   
  14.     }  
  15.   
  16.     @Override  
  17.     public void buildMemory() {  
  18.         HPComputer.setMemory(new ApacerMemory());  
  19.     }  
  20.   
  21.     @Override  
  22.     public void buildMainboard() {  
  23.         HPComputer.setMainboard(new GaMainboard());  
  24.   
  25.     }  
  26.   
  27.     @Override  
  28.     public Computer getComputer() {  
  29.         buildCPU();    
  30.         buildMemory();    
  31.         buildMainboard();    
  32.         return HPComputer;  
  33.     }  
  34.   
  35. }  

[java]  view plain  copy
  1. public class Director {  
  2.      private ComputerBuilder builder;     
  3.         public Director(ComputerBuilder builder) {     
  4.             this.builder = builder;     
  5.         }    
  6.         public Computer construct() {     
  7.             return builder.getComputer();    
  8.         }     
  9. }  

[java]  view plain  copy
  1. public class TestBuilder {  
  2.   
  3.     /** 
  4.      * @param args 
  5.      */  
  6.     public static void main(String[] args) {  
  7.         Computer lenoveComputer,hpComputer;    
  8.         ComputerBuilder lenoveComputerBuilder = new LenoveComputerBuilder();    
  9.         ComputerBuilder hpComputerBuilder = new HPComputerBuilder();    
  10.         Director director;    
  11.         director = new Director(lenoveComputerBuilder);    
  12.         lenoveComputer=director.construct();    
  13.         director = new Director(hpComputerBuilder);    
  14.         hpComputer=director.construct();    
  15.         System.out.println("lenoveComputer is made by:"+lenoveComputer.getCpu()+lenoveComputer.getMemory()+lenoveComputer.getMainboard());    
  16.         System.out.println("hpComputer is made by:"+hpComputer.getCpu()+hpComputer.getMemory()+hpComputer.getMainboard());    
  17.     }  
  18.   
  19. }  

运行结果:

lenoveComputer is made by: IntelCPU  KingstonMemory  AsusMainboard 
hpComputer is made by: AMDCPU  ApacerMemory  GaMainboard 

注解:

在main函数里面,director调用了builder里面的getComputer()方法,getComputer()方法实际就是组装的过程,getComputer()里面的buildCPU();   buildMemory();   buildMainboard();  就是在购买构件,而这些构件生产的具体过程放在了这些构件自身的类里面,可以看到buildCPU()里面有new一个对象,这就是在进行生产。这样就达到了组装和生产构件之间的分离。

最后,说说Builder模式和Factory模式之间区别的理解。Builder和Factory之间的区别就是组装和生产之间的区别,Builder着重将组装和构件的生产分离,Factory着重于优化生产的过程。本文的代码实际上还可以进行重构,例如,在buildCPU()函数里面,用到了new这个关键字,实际上可以将这个new换成工厂类,让工厂类来生产CPU。换一种说法,就是Factory不进行组装,Builder进行组装,当Factory进行组装的时候,它就变成Builder了。


原文:https://blog.csdn.net/fuhao715/article/details/7195770

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值