建造者模式

      定义:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。

      使用场景:构建复杂的产品时,产品的各个组成部分可能发生变化,但产品组合起来具有一定的规律,通过导演者(Director)来将产品的各个部分组合,指导整个生产过程。

      与工厂模式的区别:建造者模式中的建造者相当于工厂模式,但多出来了一个导演者(Director),他相当于工厂里来了个牛逼的工程指导者,这样就使工厂能更灵活的生产出产品。也可以举例为:工厂模式是演员的自导自演,然后给观众(客户端client)表演,而建造者模式多了个导演,来给观众编排节目。

这里写图片描述

  • Product:要建造的产品。
  • Builder:抽象建造者,相当于工厂模式中的抽象工厂接口或抽象类,它不具体制造产品,而是定义产品由哪些部分需要建造,以及各部分需要建造什么。
  • ConCreator:具体建造者,它负责具体的实现Builder所定义的各个部分的具体建造。
  • Director:导演者或者叫指导者,它负责指导具体建造者,按着固定的方式或者一定的顺序去建造产品。
  • -

      举个栗子:建造美女与野兽的脸部。

产品:

//脸部
public class Face {
    private Eye eye;
    private Nose nose;
    private Mouth mouth;
    public Eye getEye() {
        return eye;
    }
    public void setEye(Eye eye) {
        this.eye = eye;
    }
    public Nose getNose() {
        return nose;
    }
    public void setNose(Nose nose) {
        this.nose = nose;
    }
    public Mouth getMouth() {
        return mouth;
    }
    public void setMouth(Mouth mouth) {
        this.mouth = mouth;
    }

}
//眼睛
public class Eye {
    private String type;
    Eye(String t){
        type = t;
    }
    public void info(){
        System.out.println(type);
    }
}
//鼻子
public class Nose {
    private String type;
    Nose(String t){
        type = t;
    }
    public void info(){
        System.out.println(type);
    }
}
//嘴巴
public class Mouth {
    private String type;
    Mouth(String t){
        type = t;
    }
    public void info(){
        System.out.println(type);
    }
}

抽象建造者:

//脸部建造者
public interface FaceBuilder {
    void buildEye();
    void buildNose();
    void buildMouth();
    Face getResult();
}

具体建造者:

//美女脸部建造者
public class BeautyFaceBuilder implements FaceBuilder{
    private Face face = new Face();

    @Override
    public void buildEye() {
        System.out.println("建造美女的眼镜");
        face.setEye(new Eye("眼若丹凤"));
    }

    @Override
    public void buildNose() {
        System.out.println("建造美女的鼻子");
        face.setNose(new Nose("鼻若琼瑶"));
    }

    @Override
    public void buildMouth() {
        System.out.println("建造美女的嘴巴");
        face.setMouth(new Mouth("樱桃小口"));
    }

    @Override
    public Face getResult() {
        return face;
    }

}

//野兽脸部建造者
public class BeastFaceBuilder implements FaceBuilder{
    private Face face = new Face();
    @Override
    public void buildEye() {
        System.out.println("建造野兽的眼睛");
        face.setEye(new Eye("眼若铜铃"));
    }

    @Override
    public void buildNose() {
        System.out.println("建造野兽的鼻子");
        face.setNose(new Nose("鼻孔朝天"));
    }

    @Override
    public void buildMouth() {
        System.out.println("建造野兽的嘴巴");
        face.setMouth(new Mouth("血盆大口"));
    }

    @Override
    public Face getResult() {
        return face;
    }

}

指导者:

public class FaceDirector {
    public static void buildFace(FaceBuilder fb){
        fb.buildEye();
        fb.buildNose();
        fb.buildMouth();
    }
}

客户端:

public class ClientDemo {
    public static void main(String[] args) {
        System.out.println("------开始建造美女脸部------");
        BeautyFaceBuilder beautyFaceBuilder = new BeautyFaceBuilder();
        FaceDirector.buildFace(beautyFaceBuilder);
        Face beautyFace = beautyFaceBuilder.getResult();
        beautyFace.getEye().info();
        beautyFace.getNose().info();
        beautyFace.getMouth().info();
        System.out.println("------开始建造野兽脸部------");
        BeastFaceBuilder beastFaceBuilder = new BeastFaceBuilder();
        FaceDirector.buildFace(beastFaceBuilder);
        Face beastface = beastFaceBuilder.getResult();
        beastface.getEye().info();
        beastface.getNose().info();
        beastface.getMouth().info();
    }
}

运行结果:

------开始建造美女脸部------
建造美女的眼镜
建造美女的鼻子
建造美女的嘴巴
眼若丹凤
鼻若琼瑶
樱桃小口
------开始建造野兽脸部------
建造野兽的眼睛
建造野兽的鼻子
建造野兽的嘴巴
眼若铜铃
鼻孔朝天
血盆大口
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值