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