文章目录
6、建造者模式
属于创建型模式。
定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。(举例:就是要创建跳舞机器人和创建唱歌机器人,我们只需更建造者说我们需要跳舞机器人,它就会给我们创建跳舞机器人,创建唱歌机器人同理,这就是构建与表示分离,用同样的构建过程创建不同的表示。)
与工厂模式的区别是:建造者模式更加关注于零件装配的顺序,一般用来创建更为复杂的对象。
建造者模式最重要的就是Director(领导者),规定了建造的顺序。
优点:
- 易于扩展。想要唱歌机器人只要单独将这个类与跳舞机器人建好后,交给Director去创建。
- 代码解耦,模块化,方便维护。可以使用相同的创建过程获得不同 的产品。
缺点:
- 产品必须有较多的共同点,限制了使用范围。
以机器人为例:
public class Robbot { //机器人实体
private String head;
private String boby;
private String hand;
public String getHead() {
return head;
}
public void setHead(String head) {
this.head = head;
}
public String getBoby() {
return boby;
}
public void setBoby(String boby) {
this.boby = boby;
}
public String getHand() {
return hand;
}
public void setHand(String hand) {
this.hand = hand;
}
}
//创建机器人接口
public interface IBuildRobot {
public void buildHead();
public void buildBoby();
public void buildHand();
public Robbot createRobbot();
}
// 跳舞机器人创建者
public class DanceRobotBuilder implements IBuildRobot {
private Robbot robbot;
public DanceRobotBuilder() {
this.robbot = new Robbot();
}
@Override
public void buildHead() {
robbot.setHead("写入跳舞程序");
}
@Override
public void buildBoby() {
robbot.setBoby("钛合金身体");
}
@Override
public void buildHand() {
robbot.setHand("钛合金手");
}
public Robbot createRobbot() {
return robbot;
}
}
//唱歌机器人创建者
public class SingRobotBuilder implements IBuildRobot{
Robbot robbot;
public SingRobotBuilder() {
this.robbot = new Robbot();
}
@Override
public void buildHead() {
robbot.setHead("写入唱歌程序");
}
@Override
public void buildBoby() {
robbot.setBoby("彩色钛合金身体");
}
@Override
public void buildHand() {
robbot.setHand("彩色钛合金手");
}
@Override
public Robbot createRobbot() {
return robbot;
}
}
建造者模式最重要的就是领导者,如下:
//领导者,指定了建造机器人的顺序
public class Director {
public Robbot build(IBuildRobot iBuildRobot){
iBuildRobot.buildHead();
iBuildRobot.buildHand();
iBuildRobot.buildBoby();
return iBuildRobot.createRobbot();
}
}
测试类:
public class Test {
public static void main(String[] args) {
Director director = new Director(); //指挥者
//跳舞机器人
Robbot danceRobot = director.build(new DanceRobotBuilder());
System.out.println(danceRobot.getHead());
System.out.println(danceRobot.getHand());
System.out.println(danceRobot.getBoby());
//唱歌机器人
Robbot singRobot = director.build(new SingRobotBuilder());
System.out.println(singRobot.getHead());
System.out.println(singRobot.getHand());
System.out.println(singRobot.getBoby());
}
}