From 75df2ae3b1af0ec51986537fff61932ee6ea1d06 Mon Sep 17 00:00:00 2001 From: zhangbc Date: Mon, 12 Sep 2022 23:33:09 +0800 Subject: [PATCH 1/4] [init] init design patterns project. --- .gitignore | 63 ++++++++++++++++++ README.md | 5 ++ pom.xml | 75 ++++++++++++++++++++++ src/main/java/com/team/singleton/Main.java | 11 ++++ 4 files changed, 154 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 pom.xml create mode 100644 src/main/java/com/team/singleton/Main.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..34cda4a --- /dev/null +++ b/.gitignore @@ -0,0 +1,63 @@ +# Created by .ignore support plugin (hsz.mobi) +### Example user template template +### Example user template + +# IntelliJ project files +.idea +*.iml +out +gen +### Java template +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + +### macOS template +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +target/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..c455f92 --- /dev/null +++ b/README.md @@ -0,0 +1,5 @@ +# 项目说明 + +> 本项目为设计模式学习笔记 +> +> 资料来自B站:https://www.bilibili.com/video/BV1M5411N7uh?spm_id_from=333.999.0.0&vd_source=616bf6a004def119a1b27e570687e7ea \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..2ff63f8 --- /dev/null +++ b/pom.xml @@ -0,0 +1,75 @@ + + + + 4.0.0 + + com.team + design-patterns + 1.0-SNAPSHOT + + design-patterns + + http://www.example.com + + + UTF-8 + 1.7 + 1.7 + + + + + junit + junit + 4.11 + test + + + + + + + + + maven-clean-plugin + 3.1.0 + + + + maven-resources-plugin + 3.0.2 + + + maven-compiler-plugin + 3.8.0 + + + maven-surefire-plugin + 2.22.1 + + + maven-jar-plugin + 3.0.2 + + + maven-install-plugin + 2.5.2 + + + maven-deploy-plugin + 2.8.2 + + + + maven-site-plugin + 3.7.1 + + + maven-project-info-reports-plugin + 3.0.0 + + + + + diff --git a/src/main/java/com/team/singleton/Main.java b/src/main/java/com/team/singleton/Main.java new file mode 100644 index 0000000..2bfdb1f --- /dev/null +++ b/src/main/java/com/team/singleton/Main.java @@ -0,0 +1,11 @@ +package com.team.singleton; + +/** + * design-patteerns + * + * @author zhangbc + * @version v1.0.0 + * @date 9/12/22 11:42 PM + **/ +public class Main { +} From 1eb983822de741fee06155caa3291bf0c463086f Mon Sep 17 00:00:00 2001 From: zhangbc Date: Sun, 18 Sep 2022 01:29:28 +0800 Subject: [PATCH 2/4] [add] design pattern for singleton. --- pom.xml | 10 +++++ src/main/java/com/team/singleton/Main.java | 5 ++- src/main/java/com/team/singleton/Mgr01.java | 35 +++++++++++++++ src/main/java/com/team/singleton/Mgr02.java | 35 +++++++++++++++ src/main/java/com/team/singleton/Mgr03.java | 43 +++++++++++++++++++ src/main/java/com/team/singleton/Mgr04.java | 44 +++++++++++++++++++ src/main/java/com/team/singleton/Mgr05.java | 47 +++++++++++++++++++++ src/main/java/com/team/singleton/Mgr06.java | 47 +++++++++++++++++++++ src/main/java/com/team/singleton/Mgr07.java | 36 ++++++++++++++++ src/main/java/com/team/singleton/Mgr08.java | 27 ++++++++++++ 10 files changed, 328 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/team/singleton/Mgr01.java create mode 100644 src/main/java/com/team/singleton/Mgr02.java create mode 100644 src/main/java/com/team/singleton/Mgr03.java create mode 100644 src/main/java/com/team/singleton/Mgr04.java create mode 100644 src/main/java/com/team/singleton/Mgr05.java create mode 100644 src/main/java/com/team/singleton/Mgr06.java create mode 100644 src/main/java/com/team/singleton/Mgr07.java create mode 100644 src/main/java/com/team/singleton/Mgr08.java diff --git a/pom.xml b/pom.xml index 2ff63f8..285bd13 100644 --- a/pom.xml +++ b/pom.xml @@ -71,5 +71,15 @@ + + + org.apache.maven.plugins + maven-compiler-plugin + + 8 + 8 + + + diff --git a/src/main/java/com/team/singleton/Main.java b/src/main/java/com/team/singleton/Main.java index 2bfdb1f..20548e5 100644 --- a/src/main/java/com/team/singleton/Main.java +++ b/src/main/java/com/team/singleton/Main.java @@ -1,11 +1,14 @@ package com.team.singleton; /** - * design-patteerns + * design-patterns * * @author zhangbc * @version v1.0.0 * @date 9/12/22 11:42 PM **/ public class Main { + public static void main(String[] args) { + Mgr01 mgr = Mgr01.getInstance(); + } } diff --git a/src/main/java/com/team/singleton/Mgr01.java b/src/main/java/com/team/singleton/Mgr01.java new file mode 100644 index 0000000..f3f150f --- /dev/null +++ b/src/main/java/com/team/singleton/Mgr01.java @@ -0,0 +1,35 @@ +package com.team.singleton; + +/** + * 饿汉式 + * 类加载到内存后,就实例化一个单例,JVM保证线程安全 + * 优点:简单实用,推荐使用 + * 缺点:不管用到与否,类装载时就完成实例化 + * + * @author zhangbc + * @version v1.0.0 + * @date 9/13/22 12:02 AM + **/ +public class Mgr01 { + private static final Mgr01 INSTANCE = new Mgr01(); + + private Mgr01() {} + + public static Mgr01 getInstance() { + return INSTANCE; + } + + public void m() { + System.out.println("m"); + } + + public static void main(String[] args) { + int count = 100; + // hasCode值是一致的,说明getInstance()是同一个实例 + for (int i = 0; i < count; i++) { + new Thread(() -> + System.out.println(Mgr07.getInstance().hashCode()) + ).start(); + } + } +} diff --git a/src/main/java/com/team/singleton/Mgr02.java b/src/main/java/com/team/singleton/Mgr02.java new file mode 100644 index 0000000..5e0cb0d --- /dev/null +++ b/src/main/java/com/team/singleton/Mgr02.java @@ -0,0 +1,35 @@ +package com.team.singleton; + +/** + * 同 Mgr01 + * + * @author zhangbc + * @version v1.0.0 + * @date 9/13/22 12:16 AM + **/ +public class Mgr02 { + private static final Mgr02 INSTANCE; + static { + INSTANCE = new Mgr02(); + } + + private Mgr02() {} + + public static Mgr02 getInstance() { + return INSTANCE; + } + + public void m() { + System.out.println("m"); + } + + public static void main(String[] args) { + int count = 100; + // hasCode值是一致的,说明getInstance()是同一个实例 + for (int i = 0; i < count; i++) { + new Thread(() -> + System.out.println(Mgr07.getInstance().hashCode()) + ).start(); + } + } +} diff --git a/src/main/java/com/team/singleton/Mgr03.java b/src/main/java/com/team/singleton/Mgr03.java new file mode 100644 index 0000000..08b785b --- /dev/null +++ b/src/main/java/com/team/singleton/Mgr03.java @@ -0,0 +1,43 @@ +package com.team.singleton; + +/** + * 懒汉式(lazy loading) + * 虽然达到了按需初始化的目的,但是引入了线程不安全的问题 + * + * @author zhangbc + * @version v1.0.0 + * @date 9/13/22 12:23 AM + **/ +public class Mgr03 { + private static Mgr03 INSTANCE; + + private Mgr03() {} + + public static Mgr03 getInstance() { + if (INSTANCE == null) { + try { + Thread.sleep(1); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + INSTANCE = new Mgr03(); + } + + return INSTANCE; + } + + public void m() { + System.out.println("m"); + } + + public static void main(String[] args) { + int count = 100; + // hasCode值并不是一致的,说明getInstance()并不是同一个实例 + for (int i = 0; i < count; i++) { + new Thread(() -> + System.out.println(Mgr03.getInstance().hashCode()) + ).start(); + } + } +} diff --git a/src/main/java/com/team/singleton/Mgr04.java b/src/main/java/com/team/singleton/Mgr04.java new file mode 100644 index 0000000..e3285c5 --- /dev/null +++ b/src/main/java/com/team/singleton/Mgr04.java @@ -0,0 +1,44 @@ +package com.team.singleton; + +/** + * 懒汉式(lazy loading) + * 虽然达到了按需初始化的目的,但是引入了线程不安全的问题 + * 解决方案:通过synchronized解决,但是效率下降 + * + * @author zhangbc + * @version v1.0.0 + * @date 9/13/22 12:40 AM + **/ +public class Mgr04 { + private static Mgr04 INSTANCE; + + private Mgr04() {} + + public static synchronized Mgr04 getInstance() { + if (INSTANCE == null) { + try { + Thread.sleep(1); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + INSTANCE = new Mgr04(); + } + + return INSTANCE; + } + + public void m() { + System.out.println("m"); + } + + public static void main(String[] args) { + int count = 100; + // hasCode值是一致的,说明getInstance()是同一个实例 + for (int i = 0; i < count; i++) { + new Thread(() -> + System.out.println(Mgr04.getInstance().hashCode()) + ).start(); + } + } +} diff --git a/src/main/java/com/team/singleton/Mgr05.java b/src/main/java/com/team/singleton/Mgr05.java new file mode 100644 index 0000000..452fb26 --- /dev/null +++ b/src/main/java/com/team/singleton/Mgr05.java @@ -0,0 +1,47 @@ +package com.team.singleton; + +/** + * 懒汉式(lazy loading) + * 虽然达到了按需初始化的目的,但是引入了线程不安全的问题 + * 解决方案:通过synchronized解决,但是效率下降 + * + * @author zhangbc + * @version v1.0.0 + * @date 9/13/22 12:40 AM + **/ +public class Mgr05 { + private static Mgr05 INSTANCE; + + private Mgr05() {} + + public static Mgr05 getInstance() { + if (INSTANCE == null) { + // 妄图通过减小同步代码块的方式提高效率,然后不可行 + synchronized (Mgr05.class) { + try { + Thread.sleep(1); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + INSTANCE = new Mgr05(); + } + } + + return INSTANCE; + } + + public void m() { + System.out.println("m"); + } + + public static void main(String[] args) { + int count = 100; + // hasCode值不是一致的,说明getInstance()不是同一个实例 + for (int i = 0; i < count; i++) { + new Thread(() -> + System.out.println(Mgr05.getInstance().hashCode()) + ).start(); + } + } +} diff --git a/src/main/java/com/team/singleton/Mgr06.java b/src/main/java/com/team/singleton/Mgr06.java new file mode 100644 index 0000000..c12cccb --- /dev/null +++ b/src/main/java/com/team/singleton/Mgr06.java @@ -0,0 +1,47 @@ +package com.team.singleton; + +/** + * 双重锁机制 + * + * @author zhangbc + * @version v1.0.0 + * @date 9/13/22 12:40 AM + **/ +public class Mgr06 { + private static Mgr06 INSTANCE; + + private Mgr06() {} + + public static Mgr06 getInstance() { + if (INSTANCE == null) { + // 双重检查 + synchronized (Mgr06.class) { + if (INSTANCE == null) { + try { + Thread.sleep(1); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + INSTANCE = new Mgr06(); + } + } + } + + return INSTANCE; + } + + public void m() { + System.out.println("m"); + } + + public static void main(String[] args) { + int count = 100; + // hasCode值是一致的,说明getInstance()是同一个实例 + for (int i = 0; i < count; i++) { + new Thread(() -> + System.out.println(Mgr06.getInstance().hashCode()) + ).start(); + } + } +} diff --git a/src/main/java/com/team/singleton/Mgr07.java b/src/main/java/com/team/singleton/Mgr07.java new file mode 100644 index 0000000..db668e9 --- /dev/null +++ b/src/main/java/com/team/singleton/Mgr07.java @@ -0,0 +1,36 @@ +package com.team.singleton; + +/** + * 静态内部类方式 + * JVM 保证单例:加载外部类时不会加载外部类,即可实现懒加载 + * + * @author zhangbc + * @version v1.0.0 + * @date 9/13/22 12:40 AM + **/ +public class Mgr07 { + + private Mgr07() {} + + private static class Mgr07Holder { + private final static Mgr07 INSTANCE = new Mgr07(); + } + + public static Mgr07 getInstance() { + return Mgr07Holder.INSTANCE; + } + + public void m() { + System.out.println("m"); + } + + public static void main(String[] args) { + int count = 100; + // hasCode值是一致的,说明getInstance()是同一个实例 + for (int i = 0; i < count; i++) { + new Thread(() -> + System.out.println(Mgr07.getInstance().hashCode()) + ).start(); + } + } +} diff --git a/src/main/java/com/team/singleton/Mgr08.java b/src/main/java/com/team/singleton/Mgr08.java new file mode 100644 index 0000000..f1a6bd5 --- /dev/null +++ b/src/main/java/com/team/singleton/Mgr08.java @@ -0,0 +1,27 @@ +package com.team.singleton; + +/** + * 解决线程同步,防止反序列化 + * + * @author zhangbc + * @version v1.0.0 + * @date 9/13/22 12:40 AM + **/ +public enum Mgr08 { + + INSTANCE; + + public void m() { + System.out.println("m"); + } + + public static void main(String[] args) { + int count = 100; + // hasCode值是一致的,说明getInstance()是同一个实例 + for (int i = 0; i < count; i++) { + new Thread(() -> + System.out.println(Mgr08.INSTANCE.hashCode()) + ).start(); + } + } +} From 2152e9fb0815c8319a021904ba09e27b77ffbf3f Mon Sep 17 00:00:00 2001 From: zhangbc Date: Sun, 26 Mar 2023 22:40:15 +0800 Subject: [PATCH 3/4] [add] design pattern for strategy. --- README.md | 4 +- docs/strategy.puml | 17 ++++++++ pom.xml | 6 +++ src/main/java/com/team/singleton/Mgr01.java | 2 +- src/main/java/com/team/singleton/Mgr06.java | 2 +- src/main/java/com/team/singleton/Mgr08.java | 4 +- src/main/java/com/team/strategy/Cat.java | 30 ++++++++++++++ .../team/strategy/CatHeightComparator.java | 15 +++++++ .../team/strategy/CatWeightComparator.java | 15 +++++++ .../java/com/team/strategy/Comparable.java | 17 ++++++++ .../java/com/team/strategy/Comparator.java | 18 +++++++++ src/main/java/com/team/strategy/Dog.java | 28 +++++++++++++ .../java/com/team/strategy/DogComparator.java | 15 +++++++ src/main/java/com/team/strategy/Main.java | 40 +++++++++++++++++++ src/main/java/com/team/strategy/Sorter.java | 27 +++++++++++++ .../java/com/team/strategy/SorterTest.java | 11 +++++ 16 files changed, 247 insertions(+), 4 deletions(-) create mode 100644 docs/strategy.puml create mode 100644 src/main/java/com/team/strategy/Cat.java create mode 100644 src/main/java/com/team/strategy/CatHeightComparator.java create mode 100644 src/main/java/com/team/strategy/CatWeightComparator.java create mode 100644 src/main/java/com/team/strategy/Comparable.java create mode 100644 src/main/java/com/team/strategy/Comparator.java create mode 100644 src/main/java/com/team/strategy/Dog.java create mode 100644 src/main/java/com/team/strategy/DogComparator.java create mode 100644 src/main/java/com/team/strategy/Main.java create mode 100644 src/main/java/com/team/strategy/Sorter.java create mode 100644 src/test/java/com/team/strategy/SorterTest.java diff --git a/README.md b/README.md index c455f92..425a358 100644 --- a/README.md +++ b/README.md @@ -2,4 +2,6 @@ > 本项目为设计模式学习笔记 > -> 资料来自B站:https://www.bilibili.com/video/BV1M5411N7uh?spm_id_from=333.999.0.0&vd_source=616bf6a004def119a1b27e570687e7ea \ No newline at end of file +> 资料来自B站: +> https://www.bilibili.com/video/BV1M5411N7uh?spm_id_from=333.999.0.0&vd_source=616bf6a004def119a1b27e570687e7ea +> https://www.bilibili.com/video/BV1G44y1R7nv/?spm_id_from=333.788.recommend_more_video.2&vd_source=616bf6a004def119a1b27e570687e7ea \ No newline at end of file diff --git a/docs/strategy.puml b/docs/strategy.puml new file mode 100644 index 0000000..9052407 --- /dev/null +++ b/docs/strategy.puml @@ -0,0 +1,17 @@ +@startuml +'https://plantuml.com/class-diagram + +class client { + + sort() : void +} + +interface Comparator + +client -- Comparator + +skinparam groupInheritance 2 +class DogC extends Comparator +class CatC1 extends Comparator +class CatC2 extends Comparator +class CatC3 extends Comparator +@enduml \ No newline at end of file diff --git a/pom.xml b/pom.xml index 285bd13..b0a5a0f 100644 --- a/pom.xml +++ b/pom.xml @@ -25,6 +25,12 @@ 4.11 test + + org.junit.jupiter + junit-jupiter + 5.9.1 + test + diff --git a/src/main/java/com/team/singleton/Mgr01.java b/src/main/java/com/team/singleton/Mgr01.java index f3f150f..a3395a1 100644 --- a/src/main/java/com/team/singleton/Mgr01.java +++ b/src/main/java/com/team/singleton/Mgr01.java @@ -28,7 +28,7 @@ public static void main(String[] args) { // hasCode值是一致的,说明getInstance()是同一个实例 for (int i = 0; i < count; i++) { new Thread(() -> - System.out.println(Mgr07.getInstance().hashCode()) + System.out.println(Mgr01.getInstance().hashCode()) ).start(); } } diff --git a/src/main/java/com/team/singleton/Mgr06.java b/src/main/java/com/team/singleton/Mgr06.java index c12cccb..6f27df7 100644 --- a/src/main/java/com/team/singleton/Mgr06.java +++ b/src/main/java/com/team/singleton/Mgr06.java @@ -8,7 +8,7 @@ * @date 9/13/22 12:40 AM **/ public class Mgr06 { - private static Mgr06 INSTANCE; + private static volatile Mgr06 INSTANCE; private Mgr06() {} diff --git a/src/main/java/com/team/singleton/Mgr08.java b/src/main/java/com/team/singleton/Mgr08.java index f1a6bd5..ad12f92 100644 --- a/src/main/java/com/team/singleton/Mgr08.java +++ b/src/main/java/com/team/singleton/Mgr08.java @@ -8,7 +8,9 @@ * @date 9/13/22 12:40 AM **/ public enum Mgr08 { - + /** + * instance + */ INSTANCE; public void m() { diff --git a/src/main/java/com/team/strategy/Cat.java b/src/main/java/com/team/strategy/Cat.java new file mode 100644 index 0000000..a027ea5 --- /dev/null +++ b/src/main/java/com/team/strategy/Cat.java @@ -0,0 +1,30 @@ +package com.team.strategy; + +/** + * 策略模式 - Cat 类 + * + * @author zhangbc + * @version v1.0.0 + * @date 9/18/22 1:31 AM + **/ +public class Cat implements Comparable { + int weight, height; + + public Cat(int weight, int height) { + this.weight = weight; + this.height = height; + } + + @Override + public int compareTo(Cat cat) { + return Integer.compare(this.weight, cat.weight); + } + + @Override + public String toString() { + return "Cat{" + + "weight=" + weight + + ", height=" + height + + '}'; + } +} diff --git a/src/main/java/com/team/strategy/CatHeightComparator.java b/src/main/java/com/team/strategy/CatHeightComparator.java new file mode 100644 index 0000000..b89a153 --- /dev/null +++ b/src/main/java/com/team/strategy/CatHeightComparator.java @@ -0,0 +1,15 @@ +package com.team.strategy; + +/** + * design-patterns + * + * @author zhangbc + * @version v1.0.0 + * @date 3/26/23 10:29 PM + **/ +public class CatHeightComparator implements Comparator { + @Override + public int compare(Cat obj1, Cat obj2) { + return Integer.compare(obj2.height, obj1.height); + } +} diff --git a/src/main/java/com/team/strategy/CatWeightComparator.java b/src/main/java/com/team/strategy/CatWeightComparator.java new file mode 100644 index 0000000..228d967 --- /dev/null +++ b/src/main/java/com/team/strategy/CatWeightComparator.java @@ -0,0 +1,15 @@ +package com.team.strategy; + +/** + * design-patterns + * + * @author zhangbc + * @version v1.0.0 + * @date 3/26/23 10:29 PM + **/ +public class CatWeightComparator implements Comparator { + @Override + public int compare(Cat obj1, Cat obj2) { + return Integer.compare(obj1.weight, obj2.weight); + } +} diff --git a/src/main/java/com/team/strategy/Comparable.java b/src/main/java/com/team/strategy/Comparable.java new file mode 100644 index 0000000..24ee7db --- /dev/null +++ b/src/main/java/com/team/strategy/Comparable.java @@ -0,0 +1,17 @@ +package com.team.strategy; + +/** + * design-patterns + * + * @author zhangbc + * @version v1.0.0 + * @date 9/18/22 2:39 AM + **/ +public interface Comparable { + /** + * 比较大小 + * @param obj 比较对象 + * @return 比较结果:-1,0,1 + */ + int compareTo(T obj); +} diff --git a/src/main/java/com/team/strategy/Comparator.java b/src/main/java/com/team/strategy/Comparator.java new file mode 100644 index 0000000..4d41b48 --- /dev/null +++ b/src/main/java/com/team/strategy/Comparator.java @@ -0,0 +1,18 @@ +package com.team.strategy; + +/** + * design-patterns + * + * @author zhangbc + * @version v1.0.0 + * @date 9/18/22 11:37 PM + **/ +public interface Comparator { + /** + * 比较大小 + * @param obj1 比较对象1 + * @param obj2 比较对象2 + * @return 比较结果:-1,0,1 + */ + int compare(T obj1, T obj2); +} diff --git a/src/main/java/com/team/strategy/Dog.java b/src/main/java/com/team/strategy/Dog.java new file mode 100644 index 0000000..5de28df --- /dev/null +++ b/src/main/java/com/team/strategy/Dog.java @@ -0,0 +1,28 @@ +package com.team.strategy; + +/** + * design-patterns + * + * @author zhangbc + * @version v1.0.0 + * @date 9/18/22 2:41 AM + **/ +public class Dog implements Comparable { + int food; + + public Dog(int food) { + this.food = food; + } + + @Override + public int compareTo(Dog dog) { + return Integer.compare(this.food, dog.food); + } + + @Override + public String toString() { + return "Dog{" + + "food=" + food + + '}'; + } +} diff --git a/src/main/java/com/team/strategy/DogComparator.java b/src/main/java/com/team/strategy/DogComparator.java new file mode 100644 index 0000000..7ab16b6 --- /dev/null +++ b/src/main/java/com/team/strategy/DogComparator.java @@ -0,0 +1,15 @@ +package com.team.strategy; + +/** + * design-patterns + * + * @author zhangbc + * @version v1.0.0 + * @date 3/23/23 1:15 AM + **/ +public class DogComparator implements Comparator { + @Override + public int compare(Dog obj1, Dog obj2) { + return Integer.compare(obj1.food, obj2.food); + } +} diff --git a/src/main/java/com/team/strategy/Main.java b/src/main/java/com/team/strategy/Main.java new file mode 100644 index 0000000..351f485 --- /dev/null +++ b/src/main/java/com/team/strategy/Main.java @@ -0,0 +1,40 @@ +package com.team.strategy; + +import java.util.Arrays; + +/** + * design-patterns + * + * @author zhangbc + * @version v1.0.0 + * @date 9/18/22 1:35 AM + **/ +public class Main { + public static void main(String[] args) { + // int[] array = {9, 2, 3, 5, 7, 1, 4}; + // Sorter.sort(array); + // System.out.println(Arrays.toString(array)); + + Cat[] cats = {new Cat(3, 3), + new Cat(5, 5), + new Cat(1, 1)}; + // Sorter.sort(cats); + CatWeightComparator weightComparator = new CatWeightComparator(); + Sorter catSorter = new Sorter<>(); + catSorter.sort(cats, weightComparator); + System.out.println(Arrays.toString(cats)); + + CatHeightComparator heightComparator = new CatHeightComparator(); + catSorter.sort(cats, heightComparator); + System.out.println(Arrays.toString(cats)); + + Dog[] dogs = {new Dog(1), + new Dog(5), + new Dog(3)}; + // Sorter.sort(dogs); + DogComparator dogComparator = new DogComparator(); + Sorter dogSorter = new Sorter<>(); + dogSorter.sort(dogs, dogComparator); + System.out.println(Arrays.toString(dogs)); + } +} diff --git a/src/main/java/com/team/strategy/Sorter.java b/src/main/java/com/team/strategy/Sorter.java new file mode 100644 index 0000000..7068997 --- /dev/null +++ b/src/main/java/com/team/strategy/Sorter.java @@ -0,0 +1,27 @@ +package com.team.strategy; + +/** + * 排序算法 + * + * @author zhangbc + * @version v1.0.0 + * @date 9/18/22 1:39 AM + **/ +public class Sorter { + public void sort(T[] array, Comparator comparator) { + for (int i = 0; i < array.length - 1; i++) { + int minPos = i; + for (int j = i + 1; j < array.length; j++) { + minPos = comparator.compare(array[j], array[minPos]) < 0 ? j : minPos; + } + + swap(array, i, minPos); + } + } + + private void swap(T[] array, int i, int j) { + T temp = array[i]; + array[i] = array[j]; + array[j] = temp; + } +} diff --git a/src/test/java/com/team/strategy/SorterTest.java b/src/test/java/com/team/strategy/SorterTest.java new file mode 100644 index 0000000..bf1ad23 --- /dev/null +++ b/src/test/java/com/team/strategy/SorterTest.java @@ -0,0 +1,11 @@ +package com.team.strategy; + +/** + * design-patterns + * + * @author zhangbc + * @version v1.0.0 + * @date 9/18/22 1:46 AM + **/ +class SorterTest { +} \ No newline at end of file From c3e0c10096683c94052f0d08bc70b57923031f40 Mon Sep 17 00:00:00 2001 From: zhangbc Date: Tue, 28 Mar 2023 00:05:57 +0800 Subject: [PATCH 4/4] [add] design pattern for factory. --- README.md | 6 +++- docs/Factory.puml | 18 +++++++++++ docs/abstractFactory.puml | 20 ++++++++++++ .../team/abstractfactory/AbstractFactory.java | 28 +++++++++++++++++ .../java/com/team/abstractfactory/Ak47.java | 15 +++++++++ .../java/com/team/abstractfactory/Bread.java | 15 +++++++++ .../java/com/team/abstractfactory/Broom.java | 15 +++++++++ .../java/com/team/abstractfactory/Car.java | 15 +++++++++ .../java/com/team/abstractfactory/Food.java | 15 +++++++++ .../team/abstractfactory/MagicFactory.java | 25 +++++++++++++++ .../com/team/abstractfactory/MagicStick.java | 15 +++++++++ .../java/com/team/abstractfactory/Main.java | 31 +++++++++++++++++++ .../team/abstractfactory/ModernFactory.java | 25 +++++++++++++++ .../com/team/abstractfactory/MushRoom.java | 15 +++++++++ .../com/team/abstractfactory/Vehicle.java | 15 +++++++++ .../java/com/team/abstractfactory/Weapon.java | 15 +++++++++ src/main/java/com/team/factorymethod/Car.java | 15 +++++++++ .../com/team/factorymethod/CarFactory.java | 17 ++++++++++ .../java/com/team/factorymethod/Main.java | 21 +++++++++++++ .../java/com/team/factorymethod/Movable.java | 15 +++++++++ .../java/com/team/factorymethod/Plane.java | 15 +++++++++ .../factorymethod/SimpleVehicleFactory.java | 18 +++++++++++ 22 files changed, 388 insertions(+), 1 deletion(-) create mode 100644 docs/Factory.puml create mode 100644 docs/abstractFactory.puml create mode 100644 src/main/java/com/team/abstractfactory/AbstractFactory.java create mode 100644 src/main/java/com/team/abstractfactory/Ak47.java create mode 100644 src/main/java/com/team/abstractfactory/Bread.java create mode 100644 src/main/java/com/team/abstractfactory/Broom.java create mode 100644 src/main/java/com/team/abstractfactory/Car.java create mode 100644 src/main/java/com/team/abstractfactory/Food.java create mode 100644 src/main/java/com/team/abstractfactory/MagicFactory.java create mode 100644 src/main/java/com/team/abstractfactory/MagicStick.java create mode 100644 src/main/java/com/team/abstractfactory/Main.java create mode 100644 src/main/java/com/team/abstractfactory/ModernFactory.java create mode 100644 src/main/java/com/team/abstractfactory/MushRoom.java create mode 100644 src/main/java/com/team/abstractfactory/Vehicle.java create mode 100644 src/main/java/com/team/abstractfactory/Weapon.java create mode 100644 src/main/java/com/team/factorymethod/Car.java create mode 100644 src/main/java/com/team/factorymethod/CarFactory.java create mode 100644 src/main/java/com/team/factorymethod/Main.java create mode 100644 src/main/java/com/team/factorymethod/Movable.java create mode 100644 src/main/java/com/team/factorymethod/Plane.java create mode 100644 src/main/java/com/team/factorymethod/SimpleVehicleFactory.java diff --git a/README.md b/README.md index 425a358..02e4a8a 100644 --- a/README.md +++ b/README.md @@ -4,4 +4,8 @@ > > 资料来自B站: > https://www.bilibili.com/video/BV1M5411N7uh?spm_id_from=333.999.0.0&vd_source=616bf6a004def119a1b27e570687e7ea -> https://www.bilibili.com/video/BV1G44y1R7nv/?spm_id_from=333.788.recommend_more_video.2&vd_source=616bf6a004def119a1b27e570687e7ea \ No newline at end of file +> +> https://www.bilibili.com/video/BV1G44y1R7nv/?spm_id_from=333.788.recommend_more_video.2&vd_source=616bf6a004def119a1b27e570687e7ea +> +> 形容词用接口;名词用抽象类 +> \ No newline at end of file diff --git a/docs/Factory.puml b/docs/Factory.puml new file mode 100644 index 0000000..6c7cc8e --- /dev/null +++ b/docs/Factory.puml @@ -0,0 +1,18 @@ +@startuml +'https://plantuml.com/class-diagram + +interface Movable +class Car implements Movable +class Plane implements Movable + +class Factory { + + crate(): Movable +} +class CarFactory extends Factory +class PlaneFactory extends Factory + +Movable -- Factory +CarFactory -- Car +PlaneFactory -- Plane + +@enduml \ No newline at end of file diff --git a/docs/abstractFactory.puml b/docs/abstractFactory.puml new file mode 100644 index 0000000..7ad6ec6 --- /dev/null +++ b/docs/abstractFactory.puml @@ -0,0 +1,20 @@ +@startuml +'https://plantuml.com/class-diagram + +abstract class AbstractFactory +abstract class ModernFactory extends AbstractFactory +abstract class MagicFactory extends AbstractFactory + +abstract class Weapon +abstract class Food +abstract class Vehicle + +AbstractFactory --> Weapon +AbstractFactory --> Food +AbstractFactory --> Vehicle + +class AK47 extends Weapon +class Car extends Vehicle +class Bread extends Food + +@enduml \ No newline at end of file diff --git a/src/main/java/com/team/abstractfactory/AbstractFactory.java b/src/main/java/com/team/abstractfactory/AbstractFactory.java new file mode 100644 index 0000000..ee6f704 --- /dev/null +++ b/src/main/java/com/team/abstractfactory/AbstractFactory.java @@ -0,0 +1,28 @@ +package com.team.abstractfactory; + +/** + * java_learn_note + * + * @author zhangbc + * @version v1.0.0 + * @date 3/27/23 11:08 PM + **/ +public abstract class AbstractFactory { + /** + * create Food + * @return Food + */ + abstract Food createFood(); + + /** + * create Weapon + * @return Weapon + */ + abstract Weapon createWeapon(); + + /** + * create Vehicle + * @return Vehicle + */ + abstract Vehicle createVehicle(); +} diff --git a/src/main/java/com/team/abstractfactory/Ak47.java b/src/main/java/com/team/abstractfactory/Ak47.java new file mode 100644 index 0000000..61cb29b --- /dev/null +++ b/src/main/java/com/team/abstractfactory/Ak47.java @@ -0,0 +1,15 @@ +package com.team.abstractfactory; + +/** + * java_learn_note + * + * @author zhangbc + * @version v1.0.0 + * @date 3/27/23 1:09 AM + **/ +public class Ak47 extends Weapon { + @Override + public void shoot() { + System.out.println("AK47 shoot..."); + } +} diff --git a/src/main/java/com/team/abstractfactory/Bread.java b/src/main/java/com/team/abstractfactory/Bread.java new file mode 100644 index 0000000..22d7339 --- /dev/null +++ b/src/main/java/com/team/abstractfactory/Bread.java @@ -0,0 +1,15 @@ +package com.team.abstractfactory; + +/** + * java_learn_note + * + * @author zhangbc + * @version v1.0.0 + * @date 3/27/23 1:10 AM + **/ +public class Bread extends Food { + @Override + public void printName() { + System.out.println("This is HB bread."); + } +} diff --git a/src/main/java/com/team/abstractfactory/Broom.java b/src/main/java/com/team/abstractfactory/Broom.java new file mode 100644 index 0000000..051bbb3 --- /dev/null +++ b/src/main/java/com/team/abstractfactory/Broom.java @@ -0,0 +1,15 @@ +package com.team.abstractfactory; + +/** + * java_learn_note + * + * @author zhangbc + * @version v1.0.0 + * @date 3/27/23 1:15 AM + **/ +public class Broom extends Vehicle { + @Override + public void go() { + System.out.println("Broom go www..."); + } +} diff --git a/src/main/java/com/team/abstractfactory/Car.java b/src/main/java/com/team/abstractfactory/Car.java new file mode 100644 index 0000000..8770b85 --- /dev/null +++ b/src/main/java/com/team/abstractfactory/Car.java @@ -0,0 +1,15 @@ +package com.team.abstractfactory; + +/** + * java_learn_note + * + * @author zhangbc + * @version v1.0.0 + * @date 3/27/23 1:08 AM + **/ +public class Car extends Vehicle { + @Override + public void go() { + System.out.println("Car go www..."); + } +} diff --git a/src/main/java/com/team/abstractfactory/Food.java b/src/main/java/com/team/abstractfactory/Food.java new file mode 100644 index 0000000..d9e5d6e --- /dev/null +++ b/src/main/java/com/team/abstractfactory/Food.java @@ -0,0 +1,15 @@ +package com.team.abstractfactory; + +/** + * java_learn_note + * + * @author zhangbc + * @version v1.0.0 + * @date 3/27/23 11:09 PM + **/ +public abstract class Food { + /** + * printName + */ + abstract void printName(); +} diff --git a/src/main/java/com/team/abstractfactory/MagicFactory.java b/src/main/java/com/team/abstractfactory/MagicFactory.java new file mode 100644 index 0000000..c0100a9 --- /dev/null +++ b/src/main/java/com/team/abstractfactory/MagicFactory.java @@ -0,0 +1,25 @@ +package com.team.abstractfactory; + +/** + * java_learn_note + * + * @author zhangbc + * @version v1.0.0 + * @date 3/27/23 11:33 PM + **/ +public class MagicFactory extends AbstractFactory { + @Override + Food createFood() { + return new MushRoom(); + } + + @Override + Vehicle createVehicle() { + return new Broom(); + } + + @Override + Weapon createWeapon() { + return new MagicStick(); + } +} diff --git a/src/main/java/com/team/abstractfactory/MagicStick.java b/src/main/java/com/team/abstractfactory/MagicStick.java new file mode 100644 index 0000000..1c7ab60 --- /dev/null +++ b/src/main/java/com/team/abstractfactory/MagicStick.java @@ -0,0 +1,15 @@ +package com.team.abstractfactory; + +/** + * java_learn_note + * + * @author zhangbc + * @version v1.0.0 + * @date 3/27/23 1:14 AM + **/ +public class MagicStick extends Weapon { + @Override + public void shoot() { + System.out.println("Magic Stick shoot..."); + } +} diff --git a/src/main/java/com/team/abstractfactory/Main.java b/src/main/java/com/team/abstractfactory/Main.java new file mode 100644 index 0000000..67f31a2 --- /dev/null +++ b/src/main/java/com/team/abstractfactory/Main.java @@ -0,0 +1,31 @@ +package com.team.abstractfactory; + +/** + * java_learn_note + * + * @author zhangbc + * @version v1.0.0 + * @date 3/27/23 1:07 AM + **/ +public class Main { + public static void main(String[] args) { + Car car = new Car(); + car.go(); + + Ak47 ak47 = new Ak47(); + ak47.shoot(); + + Bread bread = new Bread(); + bread.printName(); + + AbstractFactory factory = new ModernFactory(); + Vehicle vehicle = factory.createVehicle(); + vehicle.go(); + + Weapon weapon = factory.createWeapon(); + weapon.shoot(); + + Food food = factory.createFood(); + food.printName(); + } +} diff --git a/src/main/java/com/team/abstractfactory/ModernFactory.java b/src/main/java/com/team/abstractfactory/ModernFactory.java new file mode 100644 index 0000000..7bdcc2f --- /dev/null +++ b/src/main/java/com/team/abstractfactory/ModernFactory.java @@ -0,0 +1,25 @@ +package com.team.abstractfactory; + +/** + * java_learn_note + * + * @author zhangbc + * @version v1.0.0 + * @date 3/27/23 11:33 PM + **/ +public class ModernFactory extends AbstractFactory { + @Override + Food createFood() { + return new Bread(); + } + + @Override + Vehicle createVehicle() { + return new Car(); + } + + @Override + Weapon createWeapon() { + return new Ak47(); + } +} diff --git a/src/main/java/com/team/abstractfactory/MushRoom.java b/src/main/java/com/team/abstractfactory/MushRoom.java new file mode 100644 index 0000000..870cb1a --- /dev/null +++ b/src/main/java/com/team/abstractfactory/MushRoom.java @@ -0,0 +1,15 @@ +package com.team.abstractfactory; + +/** + * java_learn_note + * + * @author zhangbc + * @version v1.0.0 + * @date 3/27/23 1:15 AM + **/ +public class MushRoom extends Food { + @Override + public void printName() { + System.out.println("This is MushRoom."); + } +} diff --git a/src/main/java/com/team/abstractfactory/Vehicle.java b/src/main/java/com/team/abstractfactory/Vehicle.java new file mode 100644 index 0000000..00f5e9d --- /dev/null +++ b/src/main/java/com/team/abstractfactory/Vehicle.java @@ -0,0 +1,15 @@ +package com.team.abstractfactory; + +/** + * java_learn_note + * + * @author zhangbc + * @version v1.0.0 + * @date 3/27/23 11:11 PM + **/ +public abstract class Vehicle { + /** + * go + */ + abstract void go(); +} diff --git a/src/main/java/com/team/abstractfactory/Weapon.java b/src/main/java/com/team/abstractfactory/Weapon.java new file mode 100644 index 0000000..8199a2d --- /dev/null +++ b/src/main/java/com/team/abstractfactory/Weapon.java @@ -0,0 +1,15 @@ +package com.team.abstractfactory; + +/** + * java_learn_note + * + * @author zhangbc + * @version v1.0.0 + * @date 3/27/23 11:10 PM + **/ +public abstract class Weapon { + /** + * shoot + */ + abstract void shoot(); +} diff --git a/src/main/java/com/team/factorymethod/Car.java b/src/main/java/com/team/factorymethod/Car.java new file mode 100644 index 0000000..f30eccc --- /dev/null +++ b/src/main/java/com/team/factorymethod/Car.java @@ -0,0 +1,15 @@ +package com.team.factorymethod; + +/** + * java_learn_note + * + * @author zhangbc + * @version v1.0.0 + * @date 3/27/23 12:47 AM + **/ +public class Car implements Movable { + @Override + public void go() { + System.out.println("Car go www..."); + } +} diff --git a/src/main/java/com/team/factorymethod/CarFactory.java b/src/main/java/com/team/factorymethod/CarFactory.java new file mode 100644 index 0000000..4994876 --- /dev/null +++ b/src/main/java/com/team/factorymethod/CarFactory.java @@ -0,0 +1,17 @@ +package com.team.factorymethod; + +import com.team.strategy.Cat; + +/** + * java_learn_note + * + * @author zhangbc + * @version v1.0.0 + * @date 3/27/23 12:58 AM + **/ +public class CarFactory { + public Movable create() { + System.out.println("A new car created!"); + return new Car(); + } +} diff --git a/src/main/java/com/team/factorymethod/Main.java b/src/main/java/com/team/factorymethod/Main.java new file mode 100644 index 0000000..7bc365e --- /dev/null +++ b/src/main/java/com/team/factorymethod/Main.java @@ -0,0 +1,21 @@ +package com.team.factorymethod; + +/** + * java_learn_note + * + * @author zhangbc + * @version v1.0.0 + * @date 3/27/23 12:46 AM + **/ +public class Main { + public static void main(String[] args) { + Movable movable = new Car(); + movable.go(); + + movable = new Plane(); + movable.go(); + + movable = new CarFactory().create(); + movable.go(); + } +} diff --git a/src/main/java/com/team/factorymethod/Movable.java b/src/main/java/com/team/factorymethod/Movable.java new file mode 100644 index 0000000..45f40a2 --- /dev/null +++ b/src/main/java/com/team/factorymethod/Movable.java @@ -0,0 +1,15 @@ +package com.team.factorymethod; + +/** + * java_learn_note + * + * @author zhangbc + * @version v1.0.0 + * @date 3/27/23 12:50 AM + **/ +public interface Movable { + /** + * 交通方式 + */ + void go(); +} diff --git a/src/main/java/com/team/factorymethod/Plane.java b/src/main/java/com/team/factorymethod/Plane.java new file mode 100644 index 0000000..4425e6e --- /dev/null +++ b/src/main/java/com/team/factorymethod/Plane.java @@ -0,0 +1,15 @@ +package com.team.factorymethod; + +/** + * java_learn_note + * + * @author zhangbc + * @version v1.0.0 + * @date 3/27/23 12:47 AM + **/ +public class Plane implements Movable { + @Override + public void go() { + System.out.println("Plane go www..."); + } +} diff --git a/src/main/java/com/team/factorymethod/SimpleVehicleFactory.java b/src/main/java/com/team/factorymethod/SimpleVehicleFactory.java new file mode 100644 index 0000000..2aefed8 --- /dev/null +++ b/src/main/java/com/team/factorymethod/SimpleVehicleFactory.java @@ -0,0 +1,18 @@ +package com.team.factorymethod; + +/** + * 简单工厂:可扩展性不好 + * + * @author zhangbc + * @version v1.0.0 + * @date 3/27/23 12:55 AM + **/ +public class SimpleVehicleFactory { + public Car createCar() { + return new Car(); + } + + public Plane createPlane() { + return new Plane(); + } +}