一建房子
最近一段时间的学习,我天天举计算器的例子,这里我已经很烦了。现在咱们来讨论一下建房子的问题,建房子的步骤是什么?想想家里建房子怎么建的?第一步肯定是打地基,第二步是建地下室,第三步是建主墙,第四步是封顶,第五步是装修,到这里基本房子建完了。代码实现
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 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();//建造别墅
建造者的好处就是把逻辑与表示分离,让逻辑按按照一定的顺序来执行,这样避免了客户端直接调用,也避免客户端的错误顺序调用,这样隐藏了产品是如何组装的,在面临复杂的逻辑的时候,流程也是不会改变的,更不会漏掉某一个过程。那么如果你想改变一个产品的内部表示,你只能重新再定义一个具体的建造者(比如你想在房子里面建造一个游泳池,就是请一个建游泳池的工人),比如在连接数据库操作的时候,你不可能先进行操作,在进行数据库连接。不官你有多么复杂的操作,都是先连接数据库,