feat: 原型模式

This commit is contained in:
Bunny 2025-02-02 21:49:23 +08:00
parent 21f806f206
commit 36c484cde2
4 changed files with 329 additions and 1 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View File

@ -961,6 +961,203 @@ 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、具体处理者Concrete Handler

View File

@ -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();
}
}
}
}

View File

@ -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();
}
}
}
}