建造者模

2019-04-13 12:15发布

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(){