From 36c484cde2bdde363c8937c377504a9240457b48 Mon Sep 17 00:00:00 2001 From: Bunny <1319900154@qq.com> Date: Sun, 2 Feb 2025 21:49:23 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=8E=9F=E5=9E=8B=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../设计模式-v2/image-20250202214232289.png | Bin 0 -> 14948 bytes README/设计模式-v2.md | 199 +++++++++++++++++- .../cn/bunny/pattern8/demo1/Prototype.java | 63 ++++++ .../cn/bunny/pattern8/demo2/Prototype.java | 68 ++++++ 4 files changed, 329 insertions(+), 1 deletion(-) create mode 100644 README/images/设计模式-v2/image-20250202214232289.png create mode 100644 pattern/src/main/java/cn/bunny/pattern8/demo1/Prototype.java create mode 100644 pattern/src/main/java/cn/bunny/pattern8/demo2/Prototype.java diff --git a/README/images/设计模式-v2/image-20250202214232289.png b/README/images/设计模式-v2/image-20250202214232289.png new file mode 100644 index 0000000000000000000000000000000000000000..6031b25af0ae2ae2944a6f37983c5b4c79505fc2 GIT binary patch literal 14948 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 XAC(Gj>5pD_j{=gSaw64227&(vl0v2S literal 0 HcmV?d00001 diff --git a/README/设计模式-v2.md b/README/设计模式-v2.md index e222a6c..1e8f978 100644 --- a/README/设计模式-v2.md +++ b/README/设计模式-v2.md @@ -961,9 +961,206 @@ CommandDemo.Computer(CPU=Low CPU, RAM=Low RAM, hardDrive=Low Driver) CommandDemo.Computer(CPU=High CPU, RAM=High RAM, hardDrive=High Driver) ``` +--- + +## 原型模式 + +![image-20250202214232289](./images/设计模式-v2/image-20250202214232289.png) + +需要三个角色:抽象原型类(Abstract Prototype)、具体原型类(Concrete Prototype)、访问类(Client) + +### 简单示例 + +提示:需要做深克隆,当类中还存在另一个类时 + +#### 错误示例代码 + +当我们对school对象进行设置时,对`resume1`进行设置结果`resume`也发生了改变。需要修改`Resume`类中的`clone`方法 + +```java +public class Prototype { + public static void main(String[] args) { + Resume resume = new Resume(); + resume.name = "Bunny"; + resume.position = "架构师"; + resume.salary = 15000; + + School school = new School(); + school.schoolName = "江南大学"; + school.time = "2025年2月2日21:38:07"; + resume.school = school; + System.out.println(resume); + + Resume resume1 = resume.clone(); + resume1.salary = 19000; + resume1.school.schoolName = "清华大学"; + System.out.println(resume1); + + Resume resume2 = resume.clone(); + resume2.salary = 20000; + System.out.println(resume2); + + System.out.println(resume1 == resume2);// false + System.out.println(resume1.school == resume2.school);// true + } + + @Data + static class Resume implements Cloneable { + private String name; + private String position; + private Integer salary; + private School school; + + @Override + public Resume clone() { + try { + return (Resume) super.clone(); + } catch (CloneNotSupportedException e) { + throw new AssertionError(); + } + } + } + + @Data + static class School implements Cloneable { + private String schoolName; + private String time; + + @Override + public School clone() { + try { + return (School) super.clone(); + } catch (CloneNotSupportedException e) { + throw new AssertionError(); + } + } + } +} +``` + +#### 运行结果: + +```java +Prototype.Resume(name=Bunny, position=架构师, salary=15000, school=Prototype.School(schoolName=江南大学, time=2025年2月2日21:38:07)) +Prototype.Resume(name=Bunny, position=架构师, salary=19000, school=Prototype.School(schoolName=清华大学, time=2025年2月2日21:38:07)) +Prototype.Resume(name=Bunny, position=架构师, salary=20000, school=Prototype.School(schoolName=清华大学, time=2025年2月2日21:38:07)) +false +true +``` + +#### 正确示例代码 + +##### 修改`conle` + +```java +@Data +static class Resume implements Cloneable { + private String name; + private String position; + private Integer salary; + private School school; + + @Override + public Resume clone() { + Resume resume = null; + try { + resume = (Resume) super.clone(); + if (school != null) { + resume.school = school.clone(); + } + } catch (CloneNotSupportedException e) { + throw new AssertionError(); + } + + return resume; + } +} +``` + +##### 示例 + +```java +public class Prototype { + public static void main(String[] args) { + Resume resume = new Resume(); + resume.name = "Bunny"; + resume.position = "架构师"; + resume.salary = 15000; + + School school = new School(); + school.schoolName = "江南大学"; + school.time = "2025年2月2日21:38:07"; + resume.school = school; + System.out.println(resume); + + Resume resume1 = resume.clone(); + resume1.salary = 19000; + resume1.school.schoolName = "清华大学"; + System.out.println(resume1); + + Resume resume2 = resume.clone(); + resume2.salary = 20000; + System.out.println(resume2); + + System.out.println(resume1 == resume2);// false + System.out.println(resume1.school == resume2.school);// false + } + + @Data + static class Resume implements Cloneable { + private String name; + private String position; + private Integer salary; + private School school; + + @Override + public Resume clone() { + Resume resume = null; + try { + resume = (Resume) super.clone(); + if (school != null) { + resume.school = school.clone(); + } + } catch (CloneNotSupportedException e) { + throw new AssertionError(); + } + + return resume; + } + } + + @Data + static class School implements Cloneable { + private String schoolName; + private String time; + + @Override + public School clone() { + try { + return (School) super.clone(); + } catch (CloneNotSupportedException e) { + throw new AssertionError(); + } + } + } +} +``` + +#### 运行结果: + +```java +Prototype.Resume(name=Bunny, position=架构师, salary=15000, school=Prototype.School(schoolName=江南大学, time=2025年2月2日21:38:07)) +Prototype.Resume(name=Bunny, position=架构师, salary=19000, school=Prototype.School(schoolName=清华大学, time=2025年2月2日21:38:07)) +Prototype.Resume(name=Bunny, position=架构师, salary=20000, school=Prototype.School(schoolName=江南大学, time=2025年2月2日21:38:07)) +false +false +``` + +--- + ## 责任链模式-未完成。。。 -主要有两个角色:抽象处理者(Handler)、具体处理者(ConcreteHandler) +主要有两个角色:抽象处理者(Handler)、具体处理者(Concrete Handler) ![image-20250202201204954](./images/设计模式-v2/image-20250202201204954.png) diff --git a/pattern/src/main/java/cn/bunny/pattern8/demo1/Prototype.java b/pattern/src/main/java/cn/bunny/pattern8/demo1/Prototype.java new file mode 100644 index 0000000..3b35d4c --- /dev/null +++ b/pattern/src/main/java/cn/bunny/pattern8/demo1/Prototype.java @@ -0,0 +1,63 @@ +package cn.bunny.pattern8.demo1; + +import lombok.Data; + +public class Prototype { + public static void main(String[] args) { + Resume resume = new Resume(); + resume.name = "Bunny"; + resume.position = "架构师"; + resume.salary = 15000; + + School school = new School(); + school.schoolName = "江南大学"; + school.time = "2025年2月2日21:38:07"; + resume.school = school; + System.out.println(resume); + + Resume resume1 = resume.clone(); + resume1.salary = 19000; + resume1.school.schoolName = "清华大学"; + System.out.println(resume1); + + Resume resume2 = resume.clone(); + resume2.salary = 20000; + System.out.println(resume2); + + System.out.println(resume1 == resume2);// false + System.out.println(resume1.school == resume2.school);// true + + } + + @Data + static class Resume implements Cloneable { + private String name; + private String position; + private Integer salary; + private School school; + + @Override + public Resume clone() { + try { + return (Resume) super.clone(); + } catch (CloneNotSupportedException e) { + throw new AssertionError(); + } + } + } + + @Data + static class School implements Cloneable { + private String schoolName; + private String time; + + @Override + public School clone() { + try { + return (School) super.clone(); + } catch (CloneNotSupportedException e) { + throw new AssertionError(); + } + } + } +} \ No newline at end of file diff --git a/pattern/src/main/java/cn/bunny/pattern8/demo2/Prototype.java b/pattern/src/main/java/cn/bunny/pattern8/demo2/Prototype.java new file mode 100644 index 0000000..1983ed1 --- /dev/null +++ b/pattern/src/main/java/cn/bunny/pattern8/demo2/Prototype.java @@ -0,0 +1,68 @@ +package cn.bunny.pattern8.demo2; + +import lombok.Data; + +public class Prototype { + public static void main(String[] args) { + Resume resume = new Resume(); + resume.name = "Bunny"; + resume.position = "架构师"; + resume.salary = 15000; + + School school = new School(); + school.schoolName = "江南大学"; + school.time = "2025年2月2日21:38:07"; + resume.school = school; + System.out.println(resume); + + Resume resume1 = resume.clone(); + resume1.salary = 19000; + resume1.school.schoolName = "清华大学"; + System.out.println(resume1); + + Resume resume2 = resume.clone(); + resume2.salary = 20000; + System.out.println(resume2); + + System.out.println(resume1 == resume2);// false + System.out.println(resume1.school == resume2.school);// false + } + + @Data + static class Resume implements Cloneable { + private String name; + private String position; + private Integer salary; + private School school; + + @Override + public Resume clone() { + Resume resume = null; + try { + resume = (Resume) super.clone(); + if (school != null) { + resume.school = school.clone(); + } + } catch (CloneNotSupportedException e) { + throw new AssertionError(); + } + + return resume; + } + } + + @Data + static class School implements Cloneable { + private String schoolName; + private String time; + + @Override + public School clone() { + try { + return (School) super.clone(); + } catch (CloneNotSupportedException e) { + throw new AssertionError(); + } + } + } +}