diff --git a/builderdemo/.idea/.gitignore b/builderdemo/.idea/.gitignore
new file mode 100644
index 0000000..7532f84
--- /dev/null
+++ b/builderdemo/.idea/.gitignore
@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Datasource local storage ignored files
+/../../../:\builderdemo\.idea/dataSources/
+/dataSources.local.xml
+# Editor-based HTTP Client requests
+/httpRequests/
diff --git a/builderdemo/.idea/compiler.xml b/builderdemo/.idea/compiler.xml
new file mode 100644
index 0000000..8b2024f
--- /dev/null
+++ b/builderdemo/.idea/compiler.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/builderdemo/.idea/jarRepositories.xml b/builderdemo/.idea/jarRepositories.xml
new file mode 100644
index 0000000..40a2eee
--- /dev/null
+++ b/builderdemo/.idea/jarRepositories.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/builderdemo/.idea/misc.xml b/builderdemo/.idea/misc.xml
new file mode 100644
index 0000000..4b661a5
--- /dev/null
+++ b/builderdemo/.idea/misc.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/builderdemo/builderdemo.iml b/builderdemo/builderdemo.iml
new file mode 100644
index 0000000..78b2cc5
--- /dev/null
+++ b/builderdemo/builderdemo.iml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/builderdemo/pom.xml b/builderdemo/pom.xml
new file mode 100644
index 0000000..5038de3
--- /dev/null
+++ b/builderdemo/pom.xml
@@ -0,0 +1,26 @@
+
+
+ 4.0.0
+
+ com.woniu.builderdemo
+ builderdemo
+ 1.0-SNAPSHOT
+
+
+ 8
+ 8
+
+
+
+
+ org.projectlombok
+ lombok
+ 1.18.24
+
+
+
+
+
+
\ No newline at end of file
diff --git a/builderdemo/src/main/java/com/woniu/builderdemo/Builder.java b/builderdemo/src/main/java/com/woniu/builderdemo/Builder.java
new file mode 100644
index 0000000..5d6248c
--- /dev/null
+++ b/builderdemo/src/main/java/com/woniu/builderdemo/Builder.java
@@ -0,0 +1,63 @@
+package com.woniu.builderdemo;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.Consumer;
+import java.util.function.Supplier;
+
+/**
+ * 通用的 Builder 模式构建器
+ *
+ */
+public class Builder {
+ private final Supplier instantiator;
+ private List> modifiers = new ArrayList<>();
+ public Builder(Supplier instantiator) {
+ this.instantiator = instantiator;
+ }
+ public static Builder of(Supplier instantiator) {
+ return new Builder<>(instantiator);
+ }
+ public Builder with(Consumer1 consumer, P1 p1) {
+ Consumer c = instance -> consumer.accept(instance, p1);
+ modifiers.add(c);
+ return this;
+ }
+ public Builder with(Consumer2 consumer, P1 p1, P2 p2) {
+ Consumer c = instance -> consumer.accept(instance, p1, p2);
+ modifiers.add(c);
+ return this;
+ }
+ public Builder with(Consumer3 consumer, P1 p1, P2 p2, P3 p3) {
+ Consumer c = instance -> consumer.accept(instance, p1, p2, p3);
+ modifiers.add(c);
+ return this;
+ }
+ public T build() {
+ T value = instantiator.get();
+ modifiers.forEach(modifier -> modifier.accept(value));
+ modifiers.clear();
+ return value;
+ }
+ /**
+ * 1 参数 Consumer
+ */
+ @FunctionalInterface
+ public interface Consumer1 {
+ void accept(T t, P1 p1);
+ }
+ /**
+ * 2 参数 Consumer
+ */
+ @FunctionalInterface
+ public interface Consumer2 {
+ void accept(T t, P1 p1, P2 p2);
+ }
+ /**
+ * 3 参数 Consumer
+ */
+ @FunctionalInterface
+ public interface Consumer3 {
+ void accept(T t, P1 p1, P2 p2, P3 p3);
+ }
+}
\ No newline at end of file
diff --git a/builderdemo/src/main/java/com/woniu/builderdemo/GirlFriend.java b/builderdemo/src/main/java/com/woniu/builderdemo/GirlFriend.java
new file mode 100644
index 0000000..57c9a44
--- /dev/null
+++ b/builderdemo/src/main/java/com/woniu/builderdemo/GirlFriend.java
@@ -0,0 +1,32 @@
+package com.woniu.builderdemo;
+
+import lombok.Data;
+
+@Data
+public class GirlFriend {
+ private String name;
+ private int age;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public int getAge() {
+ return age;
+ }
+
+ public void setAge(int age) {
+ this.age = age;
+ }
+
+ // 省略 getter & setter ...
+ public static void main(String[] args) {
+ GirlFriend myGirlFriend = new GirlFriend();
+ myGirlFriend.setName("赵丽颖");
+ myGirlFriend.setAge(18);
+ }
+}
diff --git a/builderdemo/src/main/java/com/woniu/builderdemo/GirlFriendNew.java b/builderdemo/src/main/java/com/woniu/builderdemo/GirlFriendNew.java
new file mode 100644
index 0000000..75064f0
--- /dev/null
+++ b/builderdemo/src/main/java/com/woniu/builderdemo/GirlFriendNew.java
@@ -0,0 +1,50 @@
+package com.woniu.builderdemo;
+
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+@Data
+public class GirlFriendNew {
+
+ private String name;
+ private int age;
+ private int bust;
+ private int waist;
+ private int hips;
+ private List hobby;
+ private String birthday;
+ private String address;
+ private String mobile;
+ private String email;
+ private String hairColor;
+ private Map gift;
+ // 等等等等 ...
+ // 省略 getter & setter ...
+ public static void main(String[] args) {
+ GirlFriendNew myGirlFriend = new GirlFriendNew();
+ myGirlFriend.setName("迪丽热巴");
+ myGirlFriend.setAge(18);
+ myGirlFriend.setBust(33);
+ myGirlFriend.setWaist(23);
+ myGirlFriend.setHips(33);
+ myGirlFriend.setBirthday("2001-10-26");
+ myGirlFriend.setAddress("公众号:woniuxgg");
+ myGirlFriend.setMobile("18688888888");
+ myGirlFriend.setEmail("pretty-xiaomei@qq.com");
+ myGirlFriend.setHairColor("浅棕色带点微卷");
+ List hobby = new ArrayList<>();
+ hobby.add("逛街");
+ hobby.add("购物");
+ hobby.add("买东西");
+ myGirlFriend.setHobby(hobby);
+ Map gift = new HashMap<>();
+ gift.put("情人节礼物", "LBR 1912女王时代");
+ gift.put("生日礼物", "迪奥烈焰蓝金");
+ gift.put("纪念日礼物", "阿玛尼红管唇釉");
+ myGirlFriend.setGift(gift);
+ // 等等等等 ...
+ }
+}
diff --git a/builderdemo/src/main/java/com/woniu/builderdemo/GirlFriendNewN.java b/builderdemo/src/main/java/com/woniu/builderdemo/GirlFriendNewN.java
new file mode 100644
index 0000000..fe1dcad
--- /dev/null
+++ b/builderdemo/src/main/java/com/woniu/builderdemo/GirlFriendNewN.java
@@ -0,0 +1,58 @@
+package com.woniu.builderdemo;
+
+import lombok.Data;
+
+import java.util.*;
+
+@Data
+public class GirlFriendNewN {
+ // 省略属性 ...
+ private String name;
+ private int age;
+ private int bust;
+ private int waist;
+ private int hips;
+ private List hobby;
+ private String birthday;
+ private String address;
+ private String mobile;
+ private String email;
+ private String hairColor;
+ private Map gift;
+ // 省略 getter & setter ...
+
+ // 为了演示方便,加几个聚合方法
+ public void addHobby(String hobby) {
+ this.hobby = Optional.ofNullable(this.hobby).orElse(new ArrayList<>());
+ this.hobby.add(hobby);
+ }
+ public void addGift(String day, String gift) {
+ this.gift = Optional.ofNullable(this.gift).orElse(new HashMap<>());
+ this.gift.put(day, gift);
+ }
+ public void setVitalStatistics(int bust, int waist, int hips) {
+ this.bust = bust;
+ this.waist = waist;
+ this.hips = hips;
+ }
+ public static void main(String[] args) {
+ GirlFriendNewN girlFriendNewN =
+ Builder.of(GirlFriendNewN::new)
+ .with(GirlFriendNewN::setName, "小美")
+ .with(GirlFriendNewN::setAge, 18)
+ .with(GirlFriendNewN::setVitalStatistics, 33, 23, 33)
+ .with(GirlFriendNewN::setBirthday, "2001-10-26")
+ .with(GirlFriendNewN::setAddress, "上海浦东")
+ .with(GirlFriendNewN::setMobile, "18688888888")
+ .with(GirlFriendNewN::setEmail, "pretty-xiaomei@qq.com")
+ .with(GirlFriendNewN::setHairColor, "浅棕色带点微卷")
+ .with(GirlFriendNewN::addHobby, "逛街")
+ .with(GirlFriendNewN::addHobby, "购物")
+ .with(GirlFriendNewN::addHobby, "买东西")
+ .with(GirlFriendNewN::addGift, "情人节礼物", "LBR 1912女王时代")
+ .with(GirlFriendNewN::addGift, "生日礼物", "迪奥烈焰蓝金")
+ .with(GirlFriendNewN::addGift, "纪念日礼物", "阿玛尼红管唇釉")
+ // 等等等等 ...
+ .build();
+ }
+}
diff --git a/builderdemo/src/main/java/com/woniu/builderdemo/MainApplication.java b/builderdemo/src/main/java/com/woniu/builderdemo/MainApplication.java
new file mode 100644
index 0000000..ff16f44
--- /dev/null
+++ b/builderdemo/src/main/java/com/woniu/builderdemo/MainApplication.java
@@ -0,0 +1,12 @@
+package com.woniu.builderdemo;
+
+/**
+ * 程序员经常会遇到灵魂拷问:你有对象吗?
+ *
+ * 没有,但我可以 new 一个!
+ */
+public class MainApplication {
+ public static void main(String[] args) {
+
+ }
+}
diff --git a/builderdemo/target/classes/com/woniu/builderdemo/Builder$Consumer1.class b/builderdemo/target/classes/com/woniu/builderdemo/Builder$Consumer1.class
new file mode 100644
index 0000000..ed5b0cb
Binary files /dev/null and b/builderdemo/target/classes/com/woniu/builderdemo/Builder$Consumer1.class differ
diff --git a/builderdemo/target/classes/com/woniu/builderdemo/Builder$Consumer2.class b/builderdemo/target/classes/com/woniu/builderdemo/Builder$Consumer2.class
new file mode 100644
index 0000000..8682cf7
Binary files /dev/null and b/builderdemo/target/classes/com/woniu/builderdemo/Builder$Consumer2.class differ
diff --git a/builderdemo/target/classes/com/woniu/builderdemo/Builder$Consumer3.class b/builderdemo/target/classes/com/woniu/builderdemo/Builder$Consumer3.class
new file mode 100644
index 0000000..b29a677
Binary files /dev/null and b/builderdemo/target/classes/com/woniu/builderdemo/Builder$Consumer3.class differ
diff --git a/builderdemo/target/classes/com/woniu/builderdemo/Builder.class b/builderdemo/target/classes/com/woniu/builderdemo/Builder.class
new file mode 100644
index 0000000..da5f744
Binary files /dev/null and b/builderdemo/target/classes/com/woniu/builderdemo/Builder.class differ
diff --git a/builderdemo/target/classes/com/woniu/builderdemo/GirlFriend.class b/builderdemo/target/classes/com/woniu/builderdemo/GirlFriend.class
new file mode 100644
index 0000000..67dc4be
Binary files /dev/null and b/builderdemo/target/classes/com/woniu/builderdemo/GirlFriend.class differ
diff --git a/builderdemo/target/classes/com/woniu/builderdemo/GirlFriendNew.class b/builderdemo/target/classes/com/woniu/builderdemo/GirlFriendNew.class
new file mode 100644
index 0000000..d133818
Binary files /dev/null and b/builderdemo/target/classes/com/woniu/builderdemo/GirlFriendNew.class differ
diff --git a/builderdemo/target/classes/com/woniu/builderdemo/GirlFriendNewN.class b/builderdemo/target/classes/com/woniu/builderdemo/GirlFriendNewN.class
new file mode 100644
index 0000000..836c478
Binary files /dev/null and b/builderdemo/target/classes/com/woniu/builderdemo/GirlFriendNewN.class differ
diff --git a/builderdemo/target/classes/com/woniu/builderdemo/MainApplication.class b/builderdemo/target/classes/com/woniu/builderdemo/MainApplication.class
new file mode 100644
index 0000000..90b2be9
Binary files /dev/null and b/builderdemo/target/classes/com/woniu/builderdemo/MainApplication.class differ