设计模式之建造者模式

一建房子

   最近一段时间的学习,我天天举计算器的例子,这里我已经很烦了。现在咱们来讨论一下建房子的问题,建房子的步骤是什么?想想家里建房子怎么建的?第一步肯定是打地基,第二步是建地下室,第三步是建主墙,第四步是封顶,第五步是装修,到这里基本房子建完了。代码实现

public     class  Operate3  {

public  void  bulid1(){//这里我不想查找英文单词了,起名字就随意一点
System.out.println("打地基");
}
public  void  bulid2(){
System.out.println("地下室");
}
public  void  bulid3(){//
System.out.println("建主墙");
}
public  void  bulid4(){//
System.out.println("装修");

}

}

有没有发现一个问题,这里说的建房子太抽象,建商品房是建房,建造别墅也是建房,代码里根本没有体现出来,如果建造这两个不同的房子,是不是还要分开来,因为这两个房子使用的材料,做工,装修等都不不同,是不是要创建两个类,一个叫做建商品房,一个叫做建别墅。但是它们有一个共同特点,它们的建造过程是不变的,如此改一下类。

建造过程的类

public abstract     class  Operate3  {

public abstract  void  bulid1();
public abstract void  bulid2();
public abstract void  bulid3();
public  abstract void  bulid4();

}

建造商品房

public     class   OperateC extends Operate3 {//建造商品房
public   void  bulid1(){

System.out.println("打地基1:使用钢筋混泥土");
}
public  void  bulid2(){
System.out.println("地下室1:使用钢筋混泥土");
}
public  void  bulid3(){//
System.out.println("建主墙1:使用钢筋混泥土");
}
public  void  bulid4(){//
System.out.println("装修1:中国装修风格");
}
}

建造别墅的代码

public     class   OperateD extends Operate3 {//建造别墅
public   void  bulid1(){

System.out.println("打地基2:钢筋混泥土+石头");
}
public  void  bulid2(){
System.out.println("地下室2:红砖+钢筋混泥土");
}
public  void  bulid3(){//
System.out.println("建主墙2:红砖");
}
public  void  bulid4(){//
System.out.println("装修2:欧式装修风格");
}
}

这样的代码里就能体现出来这两个房子的不同。但是又有问题,我们在平时在客户端调用的过程可能会漏掉某一个过程 或者把顺序颠倒了,你想想建房子这个流程是不是要按照规定来,是不是一步都不能少,顺序也不能反了吧

二建造者模式

   建造者模式:将一个复杂的构建与他的与他的表示分离,使得相同的构建可以创造不同的表示。意思是什么,在建房子的工程中,工人们可能不知道怎么创建房子,我们找一个懂得人来指挥工人,每一步该干什么,指挥官都知道该怎么干,但是工人具体干的活不管多复杂也只有工人自己知道。代码实现:

public     class   Director  {
  private Operate3 operate;
  public Director(Operate3 operate){
 this.operate=operate;
  }
  public void build(){//每一步该干什么指挥官知道,
 operate.bulid1();
 operate.bulid2();
 operate.bulid3();
 operate.bulid4();

  }

客户端调用:

     Operate3 c= new OperateC();
        Director di= new Director(c);//
        di.build();//建造商品房 Operate3 c= new OperateC();
        Operate3 d= new OperateD();
        Director di1= new Director(d);//

        di.build();//建造别墅

建造者的好处就是把逻辑与表示分离,让逻辑按按照一定的顺序来执行,这样避免了客户端直接调用,也避免客户端的错误顺序调用,这样隐藏了产品是如何组装的,在面临复杂的逻辑的时候,流程也是不会改变的,更不会漏掉某一个过程。那么如果你想改变一个产品的内部表示,你只能重新再定义一个具体的建造者(比如你想在房子里面建造一个游泳池,就是请一个建游泳池的工人),比如在连接数据库操作的时候,你不可能先进行操作,在进行数据库连接。不官你有多么复杂的操作,都是先连接数据库,


你可能感兴趣的:(设计模式之建造者模式)