Java实现23种设计模式(二):建造者模式(Builder模式)

二十三种设计模式分类

设计模式三大分类.jpg

一、概述

建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。将一个复杂对象的构建与其表示相分离,同样的构造过程可以创建不同的表示。主要解决复杂对象的创建,将变与不变部分分隔开来;

优点

  1. 各个具体的建造者相互独立,有利于系统的扩展。
  2. 客户端不必知道产品内部组成的细节,便于控制细节风险。

缺点

  1. 产品的组成部分必须相同,这限制了其使用范围。
  2. 如果产品的内部变化复杂,该模式会增加很多的建造者类。

场景

  1. 需要生成的对象具有复杂的内部结构。
  2. 需要生成的对象内部属性本身相互依赖。

二、实现

1. 建造者模式结构图

建造者(Builder)模式的主要角色如下。

  • 产品角色(Product):它是包含多个组成部件的复杂对象,由具体建造者来创建其各个滅部件。
  • 抽象建造者(Builder):它是一个包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回复杂产品的方法 getResult()。
  • 具体建造者(Concrete Builder):实现 Builder 接口,完成复杂产品的各个部件的具体创建方法。
  • 指挥者(Director):它调用建造者对象中的部件构造与装配方法完成复杂对象的创建,在指挥者中不涉及具体产品的信息。
建造者模式结构图

PS:UML结构图可以参考,例子实现并不根据UML图来完成,灵活实现即可;

2. 实现

PersonBuilderPerson的静态内部类,也是Person类的建造器,Person类提供builder()方法获取建造器,通过建造器可以设置Person实例的各种属性,通过链式调用可以根据不同的条件方便快捷的构建不同属性的Person实例,通过不同的表示构建不同属性的实例对象;

package cn.missbe.model.builder;

/**
 * Copyright (c) 2020.
 * Email: love1208tt@foxmail.com
 *
 * @author lyg  2020/4/29 上午11:43
 * description:
 **/

public class Person {
    private String age;
    private String name;
    private String sex;
    private String info;
    private String address;
    private String height;
    private String weight;
    private String score;

    /**
     * 基本的构造方法,访问权限为私有只能通过Builder来创建对象
     */
    private Person(final String age, final String name, final String sex, final String info, final String address, final String height, final String weight, final String score) {
        this.age = age;
        this.name = name;
        this.sex = sex;
        this.info = info;
        this.address = address;
        this.height = height;
        this.weight = weight;
        this.score = score;
    }

    public static Person.PersonBuilder builder() {
        return new Person.PersonBuilder();
    }

    /**
     * Person的内部静态Builder类,针对多个属性的对象特别适用
     */
    public static class PersonBuilder {
        private String age;
        private String name;
        private String sex;
        private String info;
        private String address;
        private String height;
        private String weight;
        private String score;

        /**
         * 私有,外部不能new对象只能过builder创建
         */
        private PersonBuilder() {
        }

        public Person.PersonBuilder basicInfo(final String name, String sex, String age) {
            this.name = name;
            this.sex = sex;
            this.age = age;
            return this;
        }

        public Person.PersonBuilder age(final String age) {
            this.age = age;
            return this;
        }

        public Person.PersonBuilder name(final String name) {
            this.name = name;
            return this;
        }

        public Person.PersonBuilder sex(final String sex) {
            this.sex = sex;
            return this;
        }

        public Person.PersonBuilder info(final String info) {
            this.info = info;
            return this;
        }

        public Person.PersonBuilder address(final String address) {
            this.address = address;
            return this;
        }

        public Person.PersonBuilder height(final String height) {
            this.height = height;
            return this;
        }

        public Person.PersonBuilder weight(final String weight) {
            this.weight = weight;
            return this;
        }

        public Person.PersonBuilder score(final String score) {
            this.score = score;
            return this;
        }

        public Person build() {
            return new Person(this.age, this.name, this.sex, this.info, this.address, this.height, this.weight, this.score);
        }

        @Override
        public String toString() {
            return "Person.PersonBuilder(age=" + this.age + ", name=" + this.name + ", sex=" + this.sex + ", info=" + this.info + ", address=" + this.address + ", height=" + this.height + ", weight=" + this.weight + ", score=" + this.score + ")";
        }
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

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

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getInfo() {
        return info;
    }

    public void setInfo(String info) {
        this.info = info;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getHeight() {
        return height;
    }

    public void setHeight(String height) {
        this.height = height;
    }

    public String getWeight() {
        return weight;
    }

    public void setWeight(String weight) {
        this.weight = weight;
    }

    public String getScore() {
        return score;
    }

    public void setScore(String score) {
        this.score = score;
    }

    @Override
    public String toString() {
        return "Person{" + "age='" + age + '\'' + ", name='" + name + '\'' + ", sex='" + sex + '\'' + ", info='" + info + '\'' + ", address='" + address + '\'' + ", height='" + height + '\'' + ", weight='" + weight + '\'' + ", score='" + score + '\'' + '}';
    }
}
   public static void main(String[] args) {
        Person person = Person.builder()
                .basicInfo("unnet", "man", "20")
                .height("170")
                .address("xxxx-xxx-xxx")
                .score("100")
                .weight("120")
                .info("this is build model")
                .build();
        System.out.println(person);
        ///修改属性
        person.setWeight("130");
        person.setAddress("cq-china");
        person.setInfo("cqupt");
        System.out.println(person);
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345