06【工厂设计模式】_小米,华为,tcl,联想四家公司都能够生产电视、手机、冰箱三件产品,,使用抽象工厂模

如何自学黑客&网络安全

黑客零基础入门学习路线&规划

初级黑客
1、网络安全理论知识(2天)
①了解行业相关背景,前景,确定发展方向。
②学习网络安全相关法律法规。
③网络安全运营的概念。
④等保简介、等保规定、流程和规范。(非常重要)

2、渗透测试基础(一周)
①渗透测试的流程、分类、标准
②信息收集技术:主动/被动信息搜集、Nmap工具、Google Hacking
③漏洞扫描、漏洞利用、原理,利用方法、工具(MSF)、绕过IDS和反病毒侦察
④主机攻防演练:MS17-010、MS08-067、MS10-046、MS12-20等

3、操作系统基础(一周)
①Windows系统常见功能和命令
②Kali Linux系统常见功能和命令
③操作系统安全(系统入侵排查/系统加固基础)

4、计算机网络基础(一周)
①计算机网络基础、协议和架构
②网络通信原理、OSI模型、数据转发流程
③常见协议解析(HTTP、TCP/IP、ARP等)
④网络攻击技术与网络安全防御技术
⑤Web漏洞原理与防御:主动/被动攻击、DDOS攻击、CVE漏洞复现

5、数据库基础操作(2天)
①数据库基础
②SQL语言基础
③数据库安全加固

6、Web渗透(1周)
①HTML、CSS和JavaScript简介
②OWASP Top10
③Web漏洞扫描工具
④Web渗透工具:Nmap、BurpSuite、SQLMap、其他(菜刀、漏扫等)
恭喜你,如果学到这里,你基本可以从事一份网络安全相关的工作,比如渗透测试、Web 渗透、安全服务、安全分析等岗位;如果等保模块学的好,还可以从事等保工程师。薪资区间6k-15k

到此为止,大概1个月的时间。你已经成为了一名“脚本小子”。那么你还想往下探索吗?

如果你想要入坑黑客&网络安全,笔者给大家准备了一份:282G全网最全的网络安全资料包评论区留言即可领取!

7、脚本编程(初级/中级/高级)
在网络安全领域。是否具备编程能力是“脚本小子”和真正黑客的本质区别。在实际的渗透测试过程中,面对复杂多变的网络环境,当常用工具不能满足实际需求的时候,往往需要对现有工具进行扩展,或者编写符合我们要求的工具、自动化脚本,这个时候就需要具备一定的编程能力。在分秒必争的CTF竞赛中,想要高效地使用自制的脚本工具来实现各种目的,更是需要拥有编程能力.

如果你零基础入门,笔者建议选择脚本语言Python/PHP/Go/Java中的一种,对常用库进行编程学习;搭建开发环境和选择IDE,PHP环境推荐Wamp和XAMPP, IDE强烈推荐Sublime;·Python编程学习,学习内容包含:语法、正则、文件、 网络、多线程等常用库,推荐《Python核心编程》,不要看完;·用Python编写漏洞的exp,然后写一个简单的网络爬虫;·PHP基本语法学习并书写一个简单的博客系统;熟悉MVC架构,并试着学习一个PHP框架或者Python框架 (可选);·了解Bootstrap的布局或者CSS。

8、超级黑客
这部分内容对零基础的同学来说还比较遥远,就不展开细说了,附上学习路线。
img

网络安全工程师企业级学习路线

img
如图片过大被平台压缩导致看不清的话,评论区点赞和评论区留言获取吧。我都会回复的

视频配套资料&国内外网安书籍、文档&工具

需要体系化学习资料的朋友,可以加我V获取:vip204888 (备注网络安全)

当然除了有配套的视频,同时也为大家整理了各种文档和书籍资料&工具,并且已经帮大家分好类了。

img
一些笔者自己买的、其他平台白嫖不到的视频教程。
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以点击这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

        case "-":
            operation = new OperationSub();
    }

    Double result = operation.getResult(num1, num2);

    System.out.println("计算的结果集为: " + result);
}

}


#### 6.1.3 使用简单工厂再改进


使用接口改进后的代码各个部件相对独立,如果以后需要修改加法类的算法也不用提供其他算法类的具体实现;但是上述代码中还存在一个具体的问题,那就是如果以后新增了其他的算法,源代码则需要一直改变;**这样违反了开闭原则,我们的程序应该是"对扩展开放,对修改关闭";即类可以新增,但源代码尽量不要再修改;**


* 设计一个工厂类:



package com.dfbz.demo01_简单工厂设计模式.demo03_使用简单工厂再改进;

/**
* @author lscl
* @version 1.0
* @intro:
*/
public class OperationFactory {
/**
* 根据计算方式来选择创建对应的对象
*
* @param method
* @return
*/
public static Operation createOperation(String method) {

    Operation operation = null;
    if (method.equals("+")) {
        operation = new OperationAdd();
    } else if (method.equals("-")) {
        operation = new OperationSub();
    }
    return operation;
}

}


* 测试类:



package com.dfbz.demo01_简单工厂设计模式.demo03_使用简单工厂再改进;

import java.util.Scanner;

/**
* @author lscl
* @version 1.0
* @intro:
*/
public class Demo01 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);

    System.out.println("请输入第一个数: ");
    double num1 = scanner.nextDouble();
    System.out.println("请输入第一个数: ");
    double num2 = scanner.nextDouble();

    System.out.println("请输入您要执行的运算符(+、-、\*、/): ");
    String method = scanner.next();

    Operation operation = OperationFactory.createOperation(method);

    Double result = operation.getResult(num1, num2);
    System.out.println("计算的结果集为: " + result);
}

}


就这样,一个简单工厂设计模式就完成了。在简单工厂模式下,任何的运算逻辑新增或者修改,都不会影响客户端的代码(Demo01),只需要添加Operation的实现类,并且修改工厂类添加逻辑即可;**降低了程序的耦合性;**


但是,简单工厂只做到了一半的"开闭原则",因为在简单工厂中,新增了新的算法类,需要修改工厂类;如果我们需要频繁的新增一些算法则会导致频繁修改工厂类;**简单工厂中,不仅对扩展开放了,对修改也开放了;**



> 
> Tips:简单工厂只适合于产品对象较少,且产品固定的需求,对于产品变化无常的需求来说显然不合适;
> 
> 
> 


#### 6.1.4 简单工厂的优缺点


* 优点:
	+ 封装了创建对象的过程,可以通过参数直接获取对象。把对象的创建和业务逻辑层分开,这样以后就避免了修改客户代码,如果要实现新产品直接修改工厂类,而不需要在原代码中修改,这样就降低了客户代码修改的可能性,更加容易扩展。
* 缺点:
	+ 1)增加新产品时还是需要修改工厂类的代码,违背了“开闭原则”。
	+ 2)简单工厂模式的工厂类单一,负责所有产品的创建,但产品基数增多时,工厂类将会变得非常臃肿,违背高内聚低耦合原则;


### 6.2 工厂方法设计模式


工厂设计模式(Factory Method):指定一个创建对象的接口,由接口的实现类来决定实例化哪个类,工厂方法把类的实例化工作延迟到子类中进行;


在简单工厂中,随着产品链的丰富,则工厂的职责会变得越来越多,这样并不利于维护。工厂方法模式是对简单工厂模式的进一步抽象化,其好处是可以使系统在不修改原来代码的情况下引进新的产品,即满足开闭原则。


#### 6.2.1 工厂方法的实现


工厂方法中,不仅把产品抽象出来,连工厂类也抽象出来,具体生成什么产品由子类来决定;


* 改进后的类图如下:


![在这里插入图片描述](https://img-blog.csdnimg.cn/09af88808295461887d632daf0d2e526.png#pic_center)


在工厂方法中,如果要对算法进行扩展,那么就新增一个工厂并且再新增一个具体算法类即可,工厂方法完全符合了开闭原则的对扩展开发,对修改关闭的原则;


* 工厂抽象接口:



package com.dfbz.demo02_工厂设计模式;

/**
* @author lscl
* @version 1.0
* @intro:
*/
public interface IFactory {
Operation createOperation();
}


* 产品抽象接口:



package com.dfbz.demo02_工厂设计模式;

/**
* @author lscl
* @version 1.0
* @intro:
*/
public interface Operation {
/**
* 负责计算两个两个数的运算结果集,到底做什么运算,交给子类
* @param num1
* @param num2
* @return
*/
public Double getResult(Double num1,Double num2);
}


* 专门用于生成加法产品的工厂类:



package com.dfbz.demo02_工厂设计模式;

/**
* @author lscl
* @version 1.0
* @intro:
*/
public class OperationAddFactory implements IFactory{
@Override
public Operation createOperation() {
return new OperationAdd();
}
}


* 专门用于生成减法产品的工厂类:



package com.dfbz.demo02_工厂设计模式;

/**
* @author lscl
* @version 1.0
* @intro:
*/
public class OperationSubFactory implements IFactory{
@Override
public Operation createOperation() {
return new OperationSub();
}
}


* 加法产品:



package com.dfbz.demo02_工厂设计模式;

/**
* @author lscl
* @version 1.0
* @intro:
*/
public class OperationAdd implements Operation {
@Override
public Double getResult(Double num1, Double num2) {
return num1 + num2;
}
}


* 减法产品:



package com.dfbz.demo02_工厂设计模式;

/**
* @author lscl
* @version 1.0
* @intro:
*/
public class OperationSub implements Operation {
@Override
public Double getResult(Double num1, Double num2) {
return num1 - num2;
}
}


* 测试类:



package com.dfbz.demo02_工厂设计模式;

/**
* @author lscl
* @version 1.0
* @intro:
*/
public class Demo01 {
public static void main(String[] args) {
// 创建工厂
IFactory factory=new OperationAddFactory();

    // 创建运算类
    Operation operation = factory.createOperation();

    // 做运算
    Double result = operation.getResult(20.0D, 30.0D);
}

}


**工厂方法完完全全做到了开闭原则**,以后我们要新增一些算法,或者第三方厂商想要新增一些算法,那么直接进行子类扩展就行;


#### 6.2.2 工厂方法的优缺点


* 优点:
	+ 1)**职责相对于简单工厂来说,更加明确**。不仅将产品类独立,还将产品工厂独立,以后修改产品工厂内部逻辑变得清晰明了;
	+ 2)在系统增加新的产品时只需要添加具体产品类和对应的具体工厂类,无须对原工厂进行任何修改,满足开闭原则;
	+ 3)高层模块只需要知道产品的抽象类,无须关系其他实现类,符合迪米特法则,依赖倒转原则;
* 缺点:
	+ 1)每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,类的数量增多,这增加了系统的复杂度。
	+ 2)每个工厂只能生产一种产品,该问题可以使用抽象工厂来解决。


### 6.3 抽象工厂设计模式


#### 6.3.1 抽象工厂设计模式概述


在工厂方法设计模式中,工厂生产的是总是同一类的产品;例如产品1工厂只能生产产品1,产品2工厂只能生产产品2;**这些工厂只生产同种类产品**,**而抽象工厂模式将考虑多种类产品的生产**。在抽象工厂中,将同一种工厂生产出来的产品称为同族产品,而同一种工厂生产出来的不同产品称为同级产品;


例如电子设备工厂能够生产手机,笔记本;旗下有小米工厂,华为工厂;小米工厂能够生产小米手机,小米笔记本;华为工厂能够生产华为手机,华为笔记本;


程序类图如下:


![在这里插入图片描述](https://img-blog.csdnimg.cn/9241baac089a4fe4bf510d61ceca9a6e.png#pic_center)


![在这里插入图片描述](https://img-blog.csdnimg.cn/6a1c9d97b6244826bb89503ba24f15bb.png#pic_center)


* 同族产品:
	+ 小米手机,小米笔记本属于同族产品,都属于小米品牌(都属于小米工厂创建的产品)
	+ 华为手机,华为笔记本属于同族产品,都属于华为品牌(都属于华为工厂创建的产品)
* 同级产品:
	+ 小米手机,华为手机属于同级产品,都属于手机产品
	+ 小米笔记本,华为笔记本属于同级产品,都属于笔记本产品


##### 1)同族和同级


**同族:只要是同一个工厂生产的产品都属于同族产品**;


![在这里插入图片描述](https://img-blog.csdnimg.cn/d12da785526e4cd9b1b69b7af4f1462a.png#pic_center)


* 小米,小米手机,小米笔记本,小米智能机,小米老年机,小米游戏本,小米商务本等都属于小米工厂生产的产品,属于同族;


**同级:工厂生产出来的产品的类别称为级别,所属同一个类别的产品,那么就是同级别产品;**


![在这里插入图片描述](https://img-blog.csdnimg.cn/b980ce8e725a40c3ab86e40fa4e271d0.png#pic_center)


* 小米手机,华为手机都是属于手机,属于同级产品;
* 小米笔记本,华为笔记本都是属于笔记本,属于同级产品;


##### 2)同族的概念


**同族是有相对概念的问题,主要看我们的程序是如何设计的**


* **关于同族:只要是同一个工厂生产的产品都属于同族产品;**
* **关于同级:工厂生产出来的产品的类别称为级别,所属同一个类别的产品,那么就是同级别产品;**


例如,在下面类图中,同族与同级的关系发生了变化:


![在这里插入图片描述](https://img-blog.csdnimg.cn/494f970c1cd74dfb912476bf4da5699c.png#pic_center)


![在这里插入图片描述](https://img-blog.csdnimg.cn/16ad129442aa4b9ab9a2210941787031.png#pic_center)


同族产品:


![在这里插入图片描述](https://img-blog.csdnimg.cn/cc539de5f7b8422b832b9f936343de0f.png#pic_center)


* 小米智能机,华为智能机属于同族产品,都属于老年机厂商生产的产品
* 小米老年机,华为老年机属于同族产品,都属于智能机厂商生产的产品


同级产品:


![在这里插入图片描述](https://img-blog.csdnimg.cn/b6cea8412cb4476f8aa167e83330d8dc.png#pic_center)


* 小米智能机,小米老年机属于同级产品;都属于小米类别
* 华为智能机,华为老年机属于同级产品;都属于华为类别


#### 6.3.2 抽象工厂的实现


抽象工厂模式的主要角色如下。


1. 抽象工厂(Abstract Factory):提供了创建产品的接口,它包含多个创建产品的方法 newProduct(),可以创建多个不同等级的产品。
2. 具体工厂(Concrete Factory):主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建。
3. 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。
4. 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间是多对一的关系。


基于类图设计程序:


![在这里插入图片描述](https://img-blog.csdnimg.cn/9bfdd8bd65e7444fb3cd2cf38d902bcc.png#pic_center)


抽象工厂:



package com.dfbz.demo03_抽象工厂设计模式;

/**
* @author lscl
* @version 1.0
* @intro: 电子设备工厂, 用于生产电子设备
*/
public abstract class AbstractFactory {

// 生产手机
public abstract Phone createPhone();

// 生产笔记本
public abstract Laptop createLaptop();

}


* 具体工厂1-小米工厂:



package com.dfbz.demo03_抽象工厂设计模式;

/**
* @author lscl
* @version 1.0
* @intro: 小米工厂,用于生产小米的设备
*/
public class XiaoMiFactory extends AbstractFactory{
@Override
public Phone createPhone() {
return new XiaoMiPhone();
}

@Override
public Laptop createLaptop() {
    return new XiaoMiLaptop();
}

}


* 具体工厂2-华为工厂:



package com.dfbz.demo03_抽象工厂设计模式;

/**
* @author lscl
* @version 1.0
* @intro: 华为工厂,用于生产华为的设备
*/
public class HuaWeiFactory extends AbstractFactory {
@Override
public Phone createPhone() {
return new HuaWeiPhone();
}

@Override
public Laptop createLaptop() {
    return new HuaWeiLaptop();
}

}


* 抽象产品1-手机:



package com.dfbz.demo03_抽象工厂设计模式;

/**
* @author lscl
* @version 1.0
* @intro: 抽象产品,抽象手机,每个手机的功能是不一样的,具体的实现交给子类
*/
public abstract class Phone {

public abstract void sendMsg();

}


* 抽象产品2-笔记本:



package com.dfbz.demo03_抽象工厂设计模式;

/**
* @author lscl
* @version 1.0
* @intro: 抽象产品,抽象笔记本,每个笔记本的功能是不一样的,具体的实现交给子类
*/
public abstract class Laptop {
public abstract void play();
}


* 具体产品1-小米手机:



package com.dfbz.demo03_抽象工厂设计模式;

/**
* @author lscl
* @version 1.0
* @intro:
*/
public class XiaoMiPhone extends Phone {
@Override
public void sendMsg() {
System.out.println(“使用小米手机发送短信…”);
}
}


* 具体产品2-小米笔记本:



package com.dfbz.demo03_抽象工厂设计模式;

/**
* @author lscl
* @version 1.0
* @intro:
*/
public class XiaoMiLaptop extends Laptop {
@Override
public void play() {
System.out.println(“使用小米笔记本打游戏…”);
}
}


* 具体产品3-华为手机:



package com.dfbz.demo03_抽象工厂设计模式;

/**
* @author lscl
* @version 1.0
* @intro:
*/
public class HuaWeiPhone extends Phone {
@Override
public void sendMsg() {
System.out.println(“使用华为手机发送短信…”);
}
}


* 具体产品4-华为笔记本:



package com.dfbz.demo03_抽象工厂设计模式;

/**
* @author lscl
* @version 1.0
* @intro:
*/
public class HuaWeiLaptop extends Laptop {
@Override
public void play() {
System.out.println(“使用华为笔记本打游戏…”);
}
}


* 测试类:



package com.dfbz.demo03_抽象工厂设计模式;

/**
* @author lscl
* @version 1.0
* @intro:
*/
public class Demo01 {
public static void main(String[] args) {

    // 使用华为工厂来创建电子设备
    AbstractFactory factory=new HuaWeiFactory();
    Laptop laptop = factory.createLaptop();
    Phone phone = factory.createPhone();

    laptop.play();
    phone.sendMsg();

    System.out.println("----------");

    // 使用小米工厂来创建电子设备
    AbstractFactory factory2=new XiaoMiFactory();
    Laptop laptop2 = factory.createLaptop();
    Phone phone2 = factory.createPhone();

一、网安学习成长路线图

网安所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

二、网安视频合集

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
在这里插入图片描述

三、精品网安学习书籍

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
在这里插入图片描述

四、网络安全源码合集+工具包

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
需要体系化学习资料的朋友,可以加我V获取:vip204888 (备注网络安全)

在这里插入图片描述

五、网络安全面试题

最后就是大家最关心的网络安全面试题板块
在这里插入图片描述在这里插入图片描述

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以点击这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 16
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值