先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上网络安全知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
七、建造者设计模式
7.1 建造者设计模式简介
当需要创建的对象非常复杂时,我们可以使用接口抽取出某些对象的相同创建过程,将创建过程交由具体的实现类来完成,这样就可以使得相同的创建行为可以创建出不同的对象,分离了创建过程与具体表现,使得创建产品的灵活性大大增加。
建造者设计模式(Builder Pattern):将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示;
- 语义解释:
- 什么是构建:构建就是指对象的创建
- 什么是表示:泛指对象的属性,行为等
- 什么是构建与表示分离:其实就是使用接口来规定其行为,然后使用具体的实现类来创建对象。使用实现类来构建,使用接口来规定其表示行为(达到构建与表示分离)
- 同样的构建过程创建不同的表示:创建的过程由接口来规范,具体创建过程的实现由子类来完成,这样不同的子类使用相同的创建过程可以创建出不同的对象;
7.2 建造者设计模式的实现
7.2.1 案例引入
我们完成某些产品的创建需要N多个步骤(创建过程复杂),这些步骤都趋向于稳定,不会变化(相同的创建过程);
例如我们在组装游戏台式机时,需要安装顶级显卡,性能一般但主频高的CPU;组装商务台式机时,只需要安装一个亮机卡,再加一个顶级CPU;但是都需要安装显卡和CPU以及一些其他部件;创建产品的步骤趋向稳定(都需要安装CPU和显卡等部件),但是需要创建不同的对象表示(游戏台式机和商务台式机);
1)UML类图如下:
2)建造者设计模式中的角色
在建造者设计模式中主要包含有4个角色:
- 1)产品(Product):要创建的复杂对象。
- 2)抽象建造者(Builder):规范要创建对象的步骤,具体的实现由具体的子类来完成。
- 3)具体建造者(ConcreteBuilder):抽象建造者的具体实现,根据不同的业务类型,来具体化创建对象的每个步骤。
- 4)指挥者(Director):调用具体建造者的每一个步骤来完成对象的创建,指挥者并不知道产品的细节;
7.2.2 代码实现
- 电脑类:
package com.pattern.demo01\_建造者设计模式;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/\*\*
\* @author lscl
\* @version 1.0
\* @intro:
\*/
@AllArgsConstructor
@NoArgsConstructor
@Data
public class Computer {
private String memory;
private String cpu;
private String keyBoard;
private String mouse;
}
- 抽象构建者:
package com.pattern.demo01\_建造者设计模式;
/\*\*
\* @author lscl
\* @version 1.0
\* @intro: 抽象构建者
\*/
public abstract class Builder {
protected Computer computer=new Computer();
// 抽象每一个步骤
public abstract void addMemory();
public abstract void addCPU();
public abstract void addKeyBoard();
public abstract void addMouse();
public abstract Computer createComputer();
}
- 具体构建者-游戏台式机构建者类:
package com.pattern.demo01\_建造者设计模式;
/\*\*
\* @author lscl
\* @version 1.0
\* @intro: 游戏台式机构建者
\*/
public class GameBuilder extends Builder {
// 实现每一个构建步骤
@Override
public void addMemory() {
computer.setMemory("添加16G内存条!");
}
@Override
public void addCPU() {
computer.setCpu("添加i5 12600K!");
}
@Override
public void addKeyBoard() {
computer.setKeyBoard("添加游戏专用机械键盘!");
}
@Override
public void addMouse() {
computer.setMouse("添加游戏专用宏鼠标!");
}
@Override
public Computer createComputer() {
return computer;
}
}
- 具体构建者-商务台式机构建者类:
package com.pattern.demo01\_建造者设计模式;
/\*\*
\* @author lscl
\* @version 1.0
\* @intro: 商务台式机构建者类
\*/
public class BusinessBuilder extends Builder {
// 实现每一个构建步骤
@Override
public void addMemory() {
computer.setMemory("添加32G内存条!");
}
@Override
public void addCPU() {
computer.setCpu("添加i9 12900K!");
}
@Override
public void addKeyBoard() {
computer.setKeyBoard("添加办公专用双飞燕键盘!");
}
@Override
public void addMouse() {
computer.setMouse("添加办公专用双飞燕鼠标!");
}
@Override
public Computer createComputer() {
return computer;
}
}
- 指挥者类:
package com.pattern.demo01\_建造者设计模式;
/\*\*
\* @author lscl
\* @version 1.0
\* @intro: 指挥者类
\*/
public class Director {
private Builder builder;
public Director(Builder builder) {
this.builder = builder;
}
/\*\*
\* 调用每一个步骤来完成对象的构建
\*
\* @return
\*/
public Computer construct() {
builder.addMemory();
builder.addCPU();
builder.addKeyBoard();
builder.addMouse();
return builder.createComputer();
}
}
在建造者模式中,客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。
7.2.3 建造者模式的链式写法
在普通建造者模式中,创建对象的方式被固定在了Director类中,不能再改变,对于一些创建过程需要变化的对象普通建造者模式将会变得难以维护,因此在实际开发中,我们通常使用建造者模式的链式写法来简化对象的创建过程;它允许我们自己定义创建对象的过程,并最终将创建好的对象返回;
- 产品类:
package com.pattern.demo02\_链式写法;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/\*\*
\* @author lscl
\* @version 1.0
\* @intro:
\*/
@AllArgsConstructor
@NoArgsConstructor
@Data
public class Computer {
private String memory;
private String cpu;
private String keyBoard;
private String mouse;
}
- 构建者类:
package com.pattern.demo02\_链式写法;
/\*\*
\* @author lscl
\* @version 1.0
\* @intro:
\*/
public class ComputerBuilder {
private Computer computer=new Computer();
public ComputerBuilder addMemory(String memory) {
computer.setMemory(memory);
return this;
}
public ComputerBuilder addCPU(String cpu) {
computer.setCpu(cpu);
return this;
}
public ComputerBuilder addKeyBoard(String keyBoard) {
computer.setKeyBoard(keyBoard);
return this;
}
## 写在最后
**在结束之际,我想重申的是,学习并非如攀登险峻高峰,而是如滴水穿石般的持久累积。尤其当我们步入工作岗位之后,持之以恒的学习变得愈发不易,如同在茫茫大海中独自划舟,稍有松懈便可能被巨浪吞噬。然而,对于我们程序员而言,学习是生存之本,是我们在激烈市场竞争中立于不败之地的关键。一旦停止学习,我们便如同逆水行舟,不进则退,终将被时代的洪流所淘汰。因此,不断汲取新知识,不仅是对自己的提升,更是对自己的一份珍贵投资。让我们不断磨砺自己,与时代共同进步,书写属于我们的辉煌篇章。**
需要完整版PDF学习资源私我
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化资料的朋友,可以点击这里获取](https://bbs.csdn.net/topics/618540462)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
将被时代的洪流所淘汰。因此,不断汲取新知识,不仅是对自己的提升,更是对自己的一份珍贵投资。让我们不断磨砺自己,与时代共同进步,书写属于我们的辉煌篇章。**
需要完整版PDF学习资源私我
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化资料的朋友,可以点击这里获取](https://bbs.csdn.net/topics/618540462)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**