zoukankan      html  css  js  c++  java
  • JAVA设计模式之构建器模式(builder)

    构建器模式:

    • 分离复杂对象的构建和表示
    • 同样的构建过程可以创建不同的表示
    • 无需记忆,自然使用
    • 同模板方法模式非常相似,只是模板方法是强调方法执

    场景:假如有一个类非常复杂,它有100个属性,如果使用java提供的构造方法构建它需要给它传递100个参数,这么构建岂不是很费劲,而且在实际的业务场景中并不需要对该

    对象的所有属性都赋值,那么使用构建器模式我们可以先构建一部分,再构建一部分,最后构建其他的,这样的化就可以根据实际业务场景灵活的控制对象的构建过程。

    代码实现:

    package com.srr.dp.builder;
    
    /**
     * 构建器接口
     */
    public interface Builder {
        Builder build0();
        Builder build1();
        Builder build2();
        ComplexClass build();
    }
    
    package com.srr.dp.builder;
    
    /**
     * 复杂对象
     */
    public class ComplexClass {
        protected class1 c1;
        protected class2 c2;
        protected class3 c3;
    }
    
    class class1 {
        private int a;
        class1(int a){
            this.a = a;
        }
    }
    
    class class2 {
        private String name;
        class2(String name){
            this.name = name;
        }
    }
    
    class class3 {
        private long b;
        class3(long b){
            this.b = b;
        }
    }
    
    package com.srr.dp.builder;
    
    /**
     * 简单构建器
     */
    public class SimpleBuilder implements Builder {
        ComplexClass cc = new ComplexClass();
        @Override
        public Builder build0() {
            class1 c1 = new class1(1);
            cc.c1 = c1;
            return this;
        }
    
        @Override
        public Builder build1() {
            class2 c2 = new class2("");
            cc.c2 = c2;
            return this;
        }
    
        @Override
        public Builder build2() {
            class3 c3 = new class3(2L);
            cc.c3 = c3;
            return this;
        }
    
        @Override
        public ComplexClass build() {
            return cc;
        }
    }
    
    package com.srr.dp.builder;
    
    /**
     * 测试类
     */
    public class T2 {
        Builder builder = new SimpleBuilder();
        ComplexClass cc = builder.build0().build1().build2()
                .build();
    }
    

    在我们实际的业务场景中如何使用的呢,请看代码:

    package com.srr.dp.builder;
    
    import java.sql.Date;
    
    /**
     * 实际应用场景使用构建器模式
     */
    public class Person {
        private int age;
        private String  name;
        private int sex;
        private Date birthday;
        private int weight;
    
        public static class PersonBuilder{
            Person person = new Person();
            public PersonBuilder buildinfo(int age,String name,int sex) {
                person.age = age;
                person.name = name;
                person.sex = sex;
                return this;
            }
    
            public PersonBuilder buildWeight(int weight) {
                person.weight = weight;
                return this;
            }
    
            public PersonBuilder buildBirthday(Date birthday) {
                person.birthday = birthday;
                return this;
            }
    
            public Person build() {
                return person;
            }
        }
    
    }
    
    package com.srr.dp.builder;
    
    import java.sql.Date;
    
    /**
     * 测试类
     * 如果Person类有100个属性,而且并不是所有的属性都需要赋值,用的时候赋值,不用的时候不传值
     * 如果使用java普通的构建方式,100个参数都赋值,读起来费劲,写起来累死
     * 鉴于只是说明原理,并没有实际构建100个属性
     */
    public class T {
        public static void main(String[] args) {
            Person person = new Person.PersonBuilder().buildinfo(32,"srr",0)
                    .buildWeight(120) //如果不想构建weight那么不调用buildWeight即可
                    .buildBirthday(new Date(1L)).build();
        }
    }
  • 相关阅读:
    sql server 镜像操作
    微信测试公众号的创见以及菜单创建
    linux安装redis步骤
    Mysql 查询表字段数量
    linux 链接mysql并覆盖数据
    linux (centos)增删改查用户命令
    CentOS修改用户密码方法
    https原理及其中所包含的对称加密、非对称加密、数字证书、数字签名
    com.mysql.cj.exceptions.InvalidConnectionAttributeException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone. 问题解决方法
    设计模式(三):模板方法模式
  • 原文地址:https://www.cnblogs.com/sx-bj-srr/p/builder.html
Copyright © 2011-2022 走看看