【Java设计模式】建造者模式

知识共享许可协议 版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons

概述

◆ 定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示

用户只需指定需要建造的类型就可以得到它们,建造过程及细节不需要知道

类型:创建型

适用场景

如果一个对象有非常复杂的内部结构(很多属性)

想把复杂对象的创建和使用分离

优点

封装性好,创建和使用分离

扩展性好、建造类之间独立、一定程度上解耦

缺点

产生多余的Builder对象

产品内部发生变化,建造者都要修改,成本较大


补充: 建造者模式更注重于方法的调用顺序,工厂模式更注重创建产品。
建造者模式可以创建一些复杂的产品,由各种复杂的部件组成
工厂模式注重把对象创建出来即可而且产品大都是一个模式。

演示

创建一个cake类

package softwareDesign.builder;

public class Cake {
    private String name;  //蛋糕名称
    private String giftBox;  //蛋糕配套礼盒
    private String taste;  //蛋糕味道
    private String poster;  //蛋糕海报

    //评价
    private String evaluation;

    public String getName() {
        return name;
    }

    public String getGiftBox() {
        return giftBox;
    }

    public String getTaste() {
        return taste;
    }

    public String getPoster() {
        return poster;
    }

    public String getEvaluation() {
        return evaluation;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setGiftBox(String giftBox) {
        this.giftBox = giftBox;
    }

    public void setTaste(String taste) {
        this.taste = taste;
    }

    public void setPoster(String poster) {
        this.poster = poster;
    }

    public void setEvaluation(String evaluation) {
        this.evaluation = evaluation;
    }

    @Override
    public String toString() {
        return "Cake{" +
                "name='" + name + '\'' +
                ", giftBox='" + giftBox + '\'' +
                ", taste='" + taste + '\'' +
                ", poster='" + poster + '\'' +
                ", evaluation='" + evaluation + '\'' +
                '}';
    }
}

创建一个建造的抽象类

package softwareDesign.builder;

public abstract class CakeBuilder {
    public abstract void buildCakeName(String cakeName);
    public abstract void buildCakeGiftBox(String cakeGiftBox);
    public abstract void buildCakeTaste(String cakeTaste);
    public abstract void buildCakePoster(String cakePoster);
    public abstract void buildCakeEvaluation(String cakeEvaluation);
    //制作蛋糕
    public abstract Cake makeCake();
}

创建一个建造的实现类

package softwareDesign.builder;

public class CakeActualBuilder extends CakeBuilder{
    private Cake cake = new Cake();

    @Override
    public void buildCakeName(String cakeName) {
        cake.setName(cakeName);
    }

    @Override
    public void buildCakeGiftBox(String cakeGiftBox) {
        cake.setGiftBox(cakeGiftBox);
    }

    @Override
    public void buildCakeTaste(String cakeTaste) {
        cake.setTaste(cakeTaste);
    }

    @Override
    public void buildCakePoster(String cakePoster) {
        cake.setPoster(cakePoster);
    }

    @Override
    public void buildCakeEvaluation(String cakeEvaluation) {
        cake.setEvaluation(cakeEvaluation);
    }

    @Override
    public Cake makeCake() {
        return cake;
    }
}

创建一个生产者

package softwareDesign.builder;

public class Employee {
    private CakeBuilder cakeBuilder;

    public void setCakeBuilder(CakeBuilder cakeBuilder) {
        this.cakeBuilder = cakeBuilder;
    }

    public Cake makeCake(String cakeName, String cakeGiftBox, String cakeTaste, String cakePoster, String cakeEvaluation) {
        this.cakeBuilder.buildCakeEvaluation(cakeEvaluation);
        this.cakeBuilder.buildCakeName(cakeName);
        this.cakeBuilder.buildCakeGiftBox(cakeGiftBox);
        this.cakeBuilder.buildCakeTaste(cakeTaste);
        this.cakeBuilder.buildCakePoster(cakePoster);
        return this.cakeBuilder.makeCake();
    }
}

看一下它的类图
在这里插入图片描述
添加Test.java

package softwareDesign.builder;

public class Test {
    public static void main(String[] args) {
        CakeBuilder cakeBuilder = new CakeActualBuilder();
        Employee employee = new Employee();
        employee.setCakeBuilder(cakeBuilder);
        Cake cake = employee.makeCake("巧克力蛋糕","巧克力蛋糕礼盒"
        ,"甜","巧克力蛋糕海报","好");
        System.out.println(cake);
    }
}

我们看一下类图:
在这里插入图片描述
根据蛋糕的不同 我们可以给Employee传入不同的信息

但是Employee并不是必须的
下面进行下一个版本:


演进版本具有很大的优势 而且应用广泛
Cake类中含有建造方法

package softwareDesign.builder;

public class Cake {
    private String name;  //蛋糕名称
    private String giftBox;  //蛋糕配套礼盒
    private String taste;  //蛋糕味道
    private String poster;  //蛋糕海报

    //评价
    private String evaluation;

    //添加的内容
    //这里通过过早期将cakeBuilder传进来 这里的this指的是cake
    public Cake(CakeBuilder cakeBuilder) {
        this.name = cakeBuilder.name;
        this.giftBox = cakeBuilder.giftBox;
        this.poster = cakeBuilder.poster;
        this.evaluation = cakeBuilder.evaluation;
        this.taste = cakeBuilder.taste;
    }

    @Override
    public String toString() {
        return "Cake{" +
                "name='" + name + '\'' +
                ", giftBox='" + giftBox + '\'' +
                ", taste='" + taste + '\'' +
                ", poster='" + poster + '\'' +
                ", evaluation='" + evaluation + '\'' +
                '}';
    }


    //添加静态内部类
    public static class CakeBuilder {
        private String name;  //蛋糕名称
        private String giftBox;  //蛋糕配套礼盒
        private String taste;  //蛋糕味道
        private String poster;  //蛋糕海报

        //评价
        private String evaluation;

        public CakeBuilder builderCakeName(String cakeName) {
            this.name = cakeName;
            return this;  //返回的是本身
        }

        public CakeBuilder builderCakePoster(String cakePoster) {
            this.poster = cakePoster;
            return this;
        }
        public CakeBuilder builderCakeGiftBox(String cakeGiftBox) {
            this.giftBox= cakeGiftBox;
            return this;
        }
        public CakeBuilder builderCakeTaste(String cakeTaste) {
            this.taste = cakeTaste;
            return this;
        }
        public CakeBuilder builderCakeEvaluation(String cakeEvaluation) {
            this.evaluation = cakeEvaluation;
            return this;
        }

        public Cake build(){
            return new Cake(this);
        }

    }
}

测试

package softwareDesign.builder;

public class Test {
    public static void main(String[] args) {
        Cake cake = new Cake.CakeBuilder()
                .builderCakeName("巧克力蛋糕")
                .builderCakeEvaluation("好")
                .builderCakeTaste("甜")
                .builderCakePoster("巧克力蛋糕海报")
                .builderCakeGiftBox("巧克力蛋糕礼盒").build();
        System.out.println(cake);
    }
}

结果;
在这里插入图片描述
UML类图:
在这里插入图片描述
Tes与CakeBuilder有着直接的关系 和Cake是间接的
这种演进版本的建造者模式 用途非常广泛 一定要好好掌握

猜你喜欢

转载自blog.csdn.net/qq_42322103/article/details/95022758