java构造者模式_Java设计模式-Builder构造者模式

  • Post author:
  • Post category:java


介绍:

构造者模式,又称之为建造者模式,建造者模式,单例模式以及工厂模式都属于创建型模式

1

应用场景

今天学mybatis的时候,知道了SQLSessionFactory使用的是builder模式来生成的。再次整理一下什么是builder模式以及应用场景。

当一个bean类重载了多个构造方法时,并且参数随机使用时,考虑使用构造者模式,

builder模式也叫建造者模式,builder模式的作用将一个复杂对象的构建与他的表示分离,使用者可以一步一步的构建一个比较复杂的对象。

2.3 builder模式

package com.wangjun.designPattern.builder;public classProduct3 {private final intid;privatefinal String name;private final inttype;private final floatprice;privateProduct3(Builder builder) {this.id =builder.id;this.name =builder.name;this.type =builder.type;this.price =builder.price;

}public static classBuilder {private intid;privateString name;private inttype;private floatprice;public Builder id(intid) {this.id =id;return this;

}publicBuilder name(String name) {this.name =name;return this;

}public Builder type(inttype) {this.type =type;return this;

}public Builder price(floatprice) {this.price =price;return this;

}publicProduct3 build() {return new Product3(this);

}

}

}

可以看到builder模式将属性定义为不可变的,然后定义一个内部静态类Builder来构建属性,再通过一个只有Builder参数的构造器来生成Product对象。Builder的setter方法返回builder本身,以便可以将属性连接起来。我们就可以像下面这样使用了。

Product3 p3 = newProduct3.Builder()

.id(10)

.name(“phone”)

.price(100)

.type(1)

.build();

当然具体使用builder的情况肯定没有这么简单,但是思路大致一样:先通过某种方式取得构造对象需要的所有参数,再通过这些参数一次性构建这个对象。比如MyBatis中SqlSessionFactoryBuilder就是通过读取MyBatis的xml配置文件来获取构造SqlSessionFactory所需要的参数的。

1

Demo

package com.yunsuibi;public classUser {private final String firstName; //required

private final String lastName; //required

private final int age; //optional

private final String phone; //optional

private final String address; //optional

privateUser(UserBuilder builder) {this.firstName =builder.firstName;this.lastName =builder.lastName;this.age =builder.age;this.phone =builder.phone;this.address =builder.address;

}publicString getFirstName() {returnfirstName;

}publicString getLastName() {returnlastName;

}public intgetAge() {returnage;

}publicString getPhone() {returnphone;

}publicString getAddress() {returnaddress;

}

@OverridepublicString toString() {return “User [firstName=” + firstName + “, lastName=” + lastName + “, age=” + age + “, phone=” +phone+ “, address=” + address + “]”;

}public static classUserBuilder {privatefinal String firstName;privatefinal String lastName;private intage;privateString phone;privateString address;publicUserBuilder(String firstName, String lastName) {this.firstName =firstName;this.lastName =lastName;

}public UserBuilder age(intage) {this.age =age;return this;

}publicUserBuilder phone(String phone) {this.phone =phone;return this;

}publicUserBuilder address(String address) {this.address =address;return this;

}publicUser build() {return new User(this);

}

}

}

运行

public static voidmain(String[] args) {

User build= new User.UserBuilder(“Jhon”, “Doe”).address(“北京”).build();

System.out.println(build);

User build2= new User.UserBuilder(“李四”, “哈哈”).address(“12”).build();

System.out.println(build2);

}



版权声明:本文为weixin_39926588原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。