开心一刻:
同事妻管严,零花钱少的可怜,今天一起打牌他输了400块没钱了。想想也可怜,就请他吃饭,吃饭时他说兄弟借十块钱吧,买张请柬回去好报帐,我当时就呆了,又TM学会一招。。。
简言:
建造者模式定义:
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
如果你需要将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示的意图时,我们需要一个模式,“建造者模式”,又叫生成器模式,建造者模式可以将一个产品内部表现与产品的生成过程分割,从而可以使一个建造过程生成具有不同的内部表现的产品对象,如果我们用了建造者模式,用户只需要指定需要建造的类型就可以得到他,具体的建造的过程就不需要知道了。
建造者模式的使用
我们以创建“人”来做案例,头,身体,左手,右手,左脚,右脚。
所以我们想定义一个抽象的建造人的类,稳定了建造人的过程,通过抽象类,实现特有的抽象方法,保证不遗留建造零件(例如每个左腿)
代码展示:
创建一个人的实体bean
public class Pen {
private String head;
private String body;
private String armLeft;
private String armRight;
private String legLeft;
private String legRight;
public String getHead() {
return head;
}
public void setHead(String head) {
this.head = head;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public String getArmLeft() {
return armLeft;
}
public void setArmLeft(String armLeft) {
this.armLeft = armLeft;
}
public String getArmRight() {
return armRight;
}
public void setArmRight(String armRight) {
this.armRight = armRight;
}
public String getLegLeft() {
return legLeft;
}
public void setLegLeft(String legLeft) {
this.legLeft = legLeft;
}
public String getLegRight() {
return legRight;
}
public void setLegRight(String legRight) {
this.legRight = legRight;
}
}
创建人的抽象类
public abstract class PersonBuilder {
private Pen p;
public PersonBuilder(Pen p) {
this.p = p;
}
public abstract void BuildHead();
public abstract void BuildBody();
public abstract void BuildArmLeft();
public abstract void BuildArmRight();
public abstract void BuildLegLeft();
public abstract void BuildLegRight();
}
在建造者模式中还有一个很重要的类,指挥者(Director) 用它来控制建造过程,也用它来隔离用户与建造过程的关联。
废话少说上代码:
public class PersonDirector {
private PersonBuilder pb;
/**
* 用户告诉指挥者,我需要建造什么样的人
* */
public PersonDirector(PersonBuilder pb) {
this.pb = pb;
}
/**
* 根据用户的选择建造人
* */
public void CreatePerson(){
pb.BuildHead();
pb.BuildBody();
pb.BuildArmLeft();
pb.BuildArmRight();
pb.BuildLegLeft();
pb.BuildLegRight();
}
}
我们接下来创建人,一个廋子 和 一个胖子,让这个廋子和胖子继承这个抽象类,重写这些抽象方法。
public class PersonFatBuilder extends PersonBuilder{
public PersonFatBuilder(Pen p) {
super(p);
}
@Override
public void BuildHead() {
System.out.println("创建一个胖的头-----");
}
@Override
public void BuildBody() {
System.out.println("创建胖的身体-----");
}
@Override
public void BuildArmLeft() {
System.out.println("创建胖的左手-----");
}
@Override
public void BuildArmRight() {
System.out.println("创建胖的右手-----");
}
@Override
public void BuildLegLeft() {
System.out.println("创建胖的左腿-----");
}
@Override
public void BuildLegRight() {
System.out.println("创建胖的右腿-----");
}
}
public class PersonThinBuilder extends PersonBuilder {
public PersonThinBuilder(Pen p) {
super(p);
}
@Override
public void BuildHead() {
System.out.println("创建一个廋的头-----");
}
@Override
public void BuildBody() {
System.out.println("创建廋的身体-----");
}
@Override
public void BuildArmLeft() {
System.out.println("创建廋的左手-----");
}
@Override
public void BuildArmRight() {
System.out.println("创建廋的右手-----");
}
@Override
public void BuildLegLeft() {
System.out.println("创建廋的左腿-----");
}
@Override
public void BuildLegRight() {
System.out.println("创建廋的右腿-----");
}
}
最后我们实现客户端的代码;
/**
* 创建一个廋的人
* */
Pen p = new Pen();
PersonThinBuilder personThinBuilder = new PersonThinBuilder(p);
PersonDirector personDirector = new PersonDirector(personThinBuilder);
personDirector.CreatePerson();
/**
* 创建一个胖的人
* */
Pen pFat = new Pen();
PersonFatBuilder personFatBuilder = new PersonFatBuilder(pFat);
PersonDirector personDirectorFat = new PersonDirector(personFatBuilder);
personDirectorFat.CreatePerson();
输出的结果如下:
如果我们需要增加一个高的和矮的人,我们怎么做?
只需要在加两个类,来实现PersonBuilder这个抽象类,吼 吼
建造者模式分析
通过这结构图,来分析一下Builder是什么?
是为了创建一个product对象各个部件指定的抽象接口。
ConcreteBuilder是什么那?
它是具体建造者,实现Builder接口,构造和装配各个部件,Product当然就是那些具体的产品。
Director是什么那?
指挥者,它是构建一个使用Builder接口对象,
在什么时候需要使用建造者模式呢?
它主要用于创建一些复杂的对象,这些对象内部构建间的建造顺序通常是稳定的,但建造通常面临着复杂的变化。
建造者模式是在当前创建复杂对象的算法应该独立于该对象的组成部分以及他们的装配方式时适用的模式。