User-Profile-Image
hankin
  • 5
  • Java
  • Kotlin
  • Spring
  • Web
  • SQL
  • MegaData
  • More
  • Experience
  • Enamiĝu al vi
  • 分类
    • Zuul
    • Zookeeper
    • XML
    • WebSocket
    • Web Notes
    • Web
    • Vue
    • Thymeleaf
    • SQL Server
    • SQL Notes
    • SQL
    • SpringSecurity
    • SpringMVC
    • SpringJPA
    • SpringCloud
    • SpringBoot
    • Spring Notes
    • Spring
    • Servlet
    • Ribbon
    • Redis
    • RabbitMQ
    • Python
    • PostgreSQL
    • OAuth2
    • NOSQL
    • Netty
    • MySQL
    • MyBatis
    • More
    • MinIO
    • MegaData
    • Maven
    • LoadBalancer
    • Kotlin Notes
    • Kotlin
    • Kafka
    • jQuery
    • JavaScript
    • Java Notes
    • Java
    • Hystrix
    • Git
    • Gateway
    • Freemarker
    • Feign
    • Eureka
    • ElasticSearch
    • Docker
    • Consul
    • Ajax
    • ActiveMQ
  • 页面
    • 归档
    • 摘要
    • 杂图
    • 问题随笔
  • 友链
    • Spring Cloud Alibaba
    • Spring Cloud Alibaba - 指南
    • Spring Cloud
    • Nacos
    • Docker
    • ElasticSearch
    • Kotlin中文版
    • Kotlin易百
    • KotlinWeb3
    • KotlinNhooo
    • 前端开源搜索
    • Ktorm ORM
    • Ktorm-KSP
    • Ebean ORM
    • Maven
    • 江南一点雨
    • 江南国际站
    • 设计模式
    • 熊猫大佬
    • java学习
    • kotlin函数查询
    • Istio 服务网格
    • istio
    • Ktor 异步 Web 框架
    • PostGis
    • kuangstudy
    • 源码地图
    • it教程吧
    • Arthas-JVM调优
    • Electron
    • bugstack虫洞栈
    • github大佬宝典
    • Sa-Token
    • 前端技术胖
    • bennyhuo-Kt大佬
    • Rickiyang博客
    • 李大辉大佬博客
    • KOIN
    • SQLDelight
    • Exposed-Kt-ORM
    • Javalin—Web 框架
    • http4k—HTTP包
    • 爱威尔大佬
    • 小土豆
    • 小胖哥安全框架
    • 负雪明烛刷题
    • Kotlin-FP-Arrow
    • Lua参考手册
    • 美团文章
    • Java 全栈知识体系
    • 尼恩架构师学习
    • 现代 JavaScript 教程
    • GO相关文档
    • Go学习导航
    • GoCN社区
    • GO极客兔兔-案例
    • 讯飞星火GPT
    • Hollis博客
    • PostgreSQL德哥
    • 优质博客推荐
    • 半兽人大佬
    • 系列教程
    • PostgreSQL文章
    • 云原生资料库
    • 并发博客大佬
Help?

Please contact us on our email for need any support

Support
    首页   ›   Java   ›   Java Notes   ›   正文
Java Notes

Java—设计模式Builder模式

2021-01-01 01:26:13
1351  0 3
参考目录 隐藏
1) Builder模式理解
2) Builder模式简单示例
3) Kotlin 版

阅读完需:约 4 分钟

Builder模式理解

比如说你需要构造一个机器:是不是会包含很多部件,但是根据相同的制造过程可以制作出不同的机器(机器猫,机器狗,机器人,机器等等)。再比如说相同的注册流程可以注册出不同的公司(百度,华为,小米等等),不同的注册信息可以表示出不同的公司。

然后我们再说说为什么要用Builder模式吧,比如你做个机器人,我们是不是要用很多参数(手,脚,关节,眼睛,嘴巴,鼻子等等)来构造,如果你用一般的构造方法,你觉得你要写多少个构造方法呢?显得特别麻烦,代码还不清晰,传参也麻烦;这样我们就引入了Builder模式。

关键点在于,你要制造的机器人也许所有的关节都要,也许仅仅只要手或脚就可以了,也有可能要其他的,有非常多的选择,所以要使用Builder模式,你要什么就造什么。

Builder模式简单示例

步骤一:

创建一个实体类CompanyClient,里面有个和实体类(只能获取变量值)相同变量的静态内部类Builder(设置变量值) 。在实体类通过构造函数来构造一个Builder,通过调用build()来建造一个具体的实体对象。

 
/**
 * 实体类 包含一个静态内部类 Builder
 */
public class CompanyClient {
   public final String companyName;
   public final String companyAddress;
 
   public final double companyRegfunds;
   public final String mPerson;
   public final String mType;
 
	
	//构造方法 
    public CompanyClient() {
        this(new Builder());
    }
	
	//构造方法
	public CompanyClient(Builder builder){
        this.companyName = builder.companyName;
        this.companyAddress = builder.companyAddress;
        this.companyRegfunds = builder.companyRegfunds;
        this.mPerson = builder.person;
        this.mType = builder.type;
    }
    public String getCompanyName() {
        return companyName;
    }
 
    public String getCompanyAddress() {
        return companyAddress;
    }
 
    public double getCompanyRegfunds() {
        return companyRegfunds;
    }
 
    public String getmPerson() {
        return mPerson;
    }
 
    public String getmType() {
        return mType;
    }
	
   
	
    public Builder newBuilder() {
        return new Builder(this);
    }
 
    @Override
    public String toString() {
        return "CompanyClient{" +
                "companyName='" + companyName + '\'' +
                ", companyAddress='" + companyAddress + '\'' +
                ", companyRegfunds=" + companyRegfunds +"千万"+
                ", mPerson=" + mPerson +
                ", mType='" + mType + '\'' +
                '}';
    }
	/**
	*静态内部类 Builder
	*/
	
    public static class Builder{
       public String companyName;
       public String companyAddress;
       public  double companyRegfunds;
       public  String person;
       public String type;
	   //构造方法
       public Builder() {
           companyName = companyName;
           companyAddress = companyAddress;
           companyRegfunds = companyRegfunds;
           person = person;
           type = type;
 
       }
	   //构造方法
       Builder(CompanyClient companyClient){
           this.companyName = companyClient.companyName;
           this.companyAddress = companyClient.companyAddress;
           this.companyRegfunds = companyClient.companyRegfunds;
           this.person = companyClient.mPerson;
           this.type = companyClient.mType;
       }
 
       public Builder setCompanyName(String name) {
           companyName = name;
           return this;
       }
 
       public Builder setCompanyAddress(String address) {
           companyAddress = address;
           return this;
       }
 
       public Builder setCompanyRegfunds(double regfunds) {
           companyRegfunds = regfunds;
           return this;
       }
 
       public Builder setmPerson(String per) {
           person = per;
           return this;
       }
 
       public Builder setmType(String typeStr) {
           type = typeStr;
           return this;
       }
		//构建一个实体
        public CompanyClient build() {
            return new CompanyClient(this);
        }
   }
}

步骤二:

实现类(TestBuilder)

public class TestBuilder {
 
    public static void main(String[] args) {
 
        CompanyClient client = new CompanyClient.Builder()
                .setCompanyName("百度")
                .setCompanyAddress("海定区百度大厦")
                .setCompanyRegfunds(5)
                .setmPerson("1000人以上")
                .build();
        System.out.println("构造出一个公司:" + client.toString());
 
        System.out.println("---------------------分隔符");
		
        CompanyClient.Builder builder = new CompanyClient.Builder();
        builder.setCompanyName("华为");
        builder.setCompanyAddress("海定区百度大厦");
        builder.setCompanyRegfunds(20);
        builder.setmType("通信科技行业");
        CompanyClient client1 = builder.build();
        System.out.println("构造出另一个公司:" + client1.toString());
    }
}

效果:


代码的关键点:

我先创建一个你想要的,所有东西的集合类,Builder ,然后在 Builder 里面加入你所需要的内容,最后将 Builder 类打包起来返回去,给最外层的类 CompanyClient 来处理就可以了。


Kotlin 版

简化:

/**
 * 实体类 包含一个静态内部类 Builder
 */
class CompanyClient @JvmOverloads constructor(builder: Builder = Builder()) {
    val companyName: String
    val companyAddress: String
    val companyRegfunds: Double
    val mPerson: String
    val mType: String

    //构造方法
    init {
        companyName = builder.companyName
        companyAddress = builder.companyAddress
        companyRegfunds = builder.companyRegfunds
        mPerson = builder.person
        mType = builder.type
    }
    
    override fun toString(): String {
        return """
            CompanyClient{ 
            companyName='${companyName}',
            companyAddress='${companyAddress},
            companyRegfunds='${companyRegfunds}千万,
            mPerson='${mPerson},
            mType='${mType}
            }
        """.trimIndent()
    }


    /**
     * 静态内部类 Builder
     */
    class Builder {
        var companyName: String = "null"
        var companyAddress: String = "null"
        var companyRegfunds: Double = 0.0
        var person: String = "null"
        var type: String = "null"

        //构造方法
        constructor() { }


        fun setCompanyName(name: String): Builder {
            companyName = name
            return this
        }

        fun setCompanyAddress(address: String): Builder {
            companyAddress = address
            return this
        }

        fun setCompanyRegfunds(regfunds: Double): Builder {
            companyRegfunds = regfunds
            return this
        }

        fun setmPerson(per: String): Builder {
            person = per
            return this
        }

        fun setmType(typeStr: String): Builder {
            type = typeStr
            return this
        }

        //构建一个实体
        fun build(): CompanyClient {
            return CompanyClient(this)
        }
    }
    
}
fun main(args: Array<String>) {
    val client = CompanyClient.Builder()
            .setCompanyName("百度")
            .setCompanyAddress("海定区百度大厦")
            .setCompanyRegfunds(5.0)
            .setmPerson("1000人以上")
            .build()
    println("构造出一个公司:$client")
    println("---------------------分隔符")
    val builder = CompanyClient.Builder()
    builder.setCompanyName("华为")
    builder.setCompanyAddress("海定区百度大厦")
    builder.setCompanyRegfunds(20.0)
    builder.setmType("通信科技行业")
    val client1 = builder.build()
    println("构造出另一个公司:$client1")
}

如本文“对您有用”,欢迎随意打赏作者,让我们坚持创作!

3 打赏
Enamiĝu al vi
不要为明天忧虑.因为明天自有明天的忧虑.一天的难处一天当就够了。
543文章 68评论 308点赞 1055589浏览

随机文章
Redis笔记—String
6年前
Kotlin-注解—注解(三十)
5年前
SpringBoot—静态资源到底要放在哪里
6年前
HttpMessageConverter—关于一个字符串到java对象的转化
6年前
MyBatis笔记10—resultType(返回类型)
6年前
博客统计
  • 日志总数:543 篇
  • 评论数目:68 条
  • 建站日期:2020-03-06
  • 运行天数:2260 天
  • 标签总数:23 个
  • 最后更新:2024-12-20
Copyright © 2026 网站备案号: 浙ICP备20017730号 身体没有灵魂是死的,信心没有行为也是死的。
主页
页面
  • 归档
  • 摘要
  • 杂图
  • 问题随笔
博主
Enamiĝu al vi
Enamiĝu al vi 管理员
To be, or not to be
543 文章 68 评论 1055589 浏览
测试
测试
看板娘
赞赏作者

请通过微信、支付宝 APP 扫一扫

感谢您对作者的支持!

 支付宝 微信支付