Builder模式,将产品的内部表象和产品的生成过程分割开来,从而使一个建造过程生成具有不同的内部
表象的产品对象。建造模式使得产品内部表象可以独立的变化,客户不必知道产品内部组成的细节。建造模式可以强制实行一种分步骤进行的建造过程。将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
相关模式:思路和
模板方法模式很像,模板方法是封装算法流程,对某些细节,提供接口由子类修改,建造者模式更为高层一点,将所有细节都交由子类实现。
建造者模式的使用情况:以下情况应当使用建造者模式:1、需要生成的产品对象有复杂的内部结构。2、需要生成的产品对象的属性相互依赖,建造者模式可以强迫生成顺序。3、 在对象创建过程中会使用到系统中的一些其它对象,这些对象在产品对象的创建过程中不易得到。优缺点:优点:1、建造者模式的使用使得产品内部表象可以独立的变化,使客户端不必知道产品内部组成细节。 2、每一个Builder都相对独立,而与其它的Builder无关。 3、可以使对构造过程更加精细控制,以降低控制细节的风险。4、将构建代码和表示代码分开。缺点:1、由于其的变化点在于对象创建的细节,故其也难于分步骤构建的算法需求的变动,因为其关注的是对象创建顺序。建造者模式一般适用于稳定的系统,比如说同样是对人的描述,如果描述的是正常人,就可用,但是对于残疾人,因为系统不再稳定,再使用的话就无法满足“开闭原则”了。
当要生产的一种产品具有相同的结构,并且每个构件的生产都很繁杂,就可以用Builder模式将具体构件的生产与整个成品的组装分离开来。还是拿本文的代码来举例,生产一台笔记本,笔记本的厂家不需要知道CPU怎么生产的,不需要关心内存怎么生产的,也不需要关心主板怎么生产的等。当他在生产一台笔记本的时候,只会说,我要一块Intel的CPU,于是就有了CPU(至于Intel的CPU怎么生产的他不关心,他只要一个CPu),他又说我要一块金士顿内存,于是就有了金士顿内存,这样直到他得到了所有的构件,然后他把这些构件组装起来,组成一台笔记本卖给客户。这就是一个典型的Builder模式。下面是代码:
[java] view plain copy-
-
-
- public abstract class CPU {
- public abstract CPU getCPU();
- }
[java] view plain copy-
-
-
- public class IntelCPU extends CPU {
-
- public IntelCPU(){};
-
- @Override
- public CPU getCPU() {
-
- return new IntelCPU();
- }
-
- public String toString(){
- return " IntelCPU ";
- }
- }
[java] view plain copy-
-
-
- public class AMDCPU extends CPU {
-
- public AMDCPU(){};
- @Override
- public CPU getCPU() {
-
- return new AMDCPU();
- }
-
- public String toString(){
- return " AMDCPU ";
- }
-
- }
[java] view plain copy-
-
-
- public abstract class Memory {
- public abstract Memory getMemory();
- }
[java] view plain copy-
-
-
- public class KingstonMemory extends Memory {
- public KingstonMemory(){};
- @Override
- public Memory getMemory() {
- return new KingstonMemory();
- }
-
- public String toString(){
- return " KingstonMemory ";
- }
- }
[java] view plain copy-
-
-
- public class ApacerMemory extends Memory {
- public ApacerMemory(){};
- @Override
- public Memory getMemory() {
-
- return new ApacerMemory();
- }
-
- public String toString(){
- return " ApacerMemory ";
- }
- }
[java] view plain copy- **
- * 主板抽象类
- */
- public abstract class Mainboard {
- public abstract Mainboard getMainboard();
- }
[java] view plain copy-
-
-
- public class AsusMainboard extends Mainboard {
- public AsusMainboard(){};
- @Override
- public Mainboard getMainboard() {
-
- return new AsusMainboard();
- }
-
- public String toString(){
-