Python 设计模式(创建型)
文章目录
- 抽象工厂模式
- 场景
- 示例
- 单例模式
- 场景
- 实现方式
- 工厂方法模式
- 场景
- 示例
- 简单工厂模式
- 场景
- 示例
- 建造者模式
- 场景
- 示例
- 原型模式
- 场景
- 示例
抽象工厂模式
抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一种将一组相关或相互依赖的对象集合起来创建的方式,而无需指定它们的具体类。抽象工厂模式可以被看作是工厂方法模式的延伸,它不仅创建单一对象,而是创建一系列相关对象的家族。
-
抽象工厂(Abstract Factory):定义了创建一系列相关对象的方法接口。通常是一个接口或者抽象类。
-
具体工厂(Concrete Factory):实现抽象工厂接口,负责创建一组具体对象。
-
抽象产品(Abstract Product):定义了一组相关产品的接口。通常是一个接口或者抽象类。
-
具体产品(Concrete Product):实现了抽象产品接口,是抽象工厂所创建的具体对象。
场景
-
需要创建一组相关或相互依赖的对象:如果系统中有一组相关的对象需要同时创建,并且它们之间存在一定的依赖关系,可以考虑使用抽象工厂模式。这样可以确保创建的对象之间的配合和一致性。
-
系统中有多个产品族:如果系统中有多个产品族,且每个产品族的产品有一定的关联性,可以使用抽象工厂模式来管理这些产品族。这样可以使得产品族之间的变化和扩展更加容易。
-
需要独立于具体工厂的创建过程:如果系统需要独立于具体工厂的创建过程,而只关心产品的组合和表示,可以考虑使用抽象工厂模式。这样可以使得系统更加灵活,可以方便地切换不同的产品组合。
-
GUI 库:一个图形用户界面(GUI)库需要创建不同风格的按钮、文本框和下拉框等组件,可以使用抽象工厂模式来管理不同风格组件的创建。
-
操作系统平台:一个操作系统平台需要支持不同的文件系统和网络协议,可以使用抽象工厂模式来管理不同平台下文件系统和网络协议的创建。
-
数据库访问:一个数据库访问库需要支持不同数据库(如 MySQL、PostgreSQL 等)的访问,可以使用抽象工厂模式来管理不同数据库访问类的创建。
示例
# 抽象产品 - 按钮
class Button:def click(self):pass# 具体产品 - Windows 风格按钮
class WindowsButton(Button):def click(self):print("Windows 风格按钮被点击")# 具体产品 - Mac 风格按钮
class MacButton(Button):def click(self):print("Mac 风格按钮被点击")# 抽象产品 - 文本框
class TextBox:def input_text(self):pass# 具体产品 - Windows 风格文本框
class WindowsTextBox(TextBox):def input_text(self):print("在 Windows 风格文本框中输入文本")# 具体产品 - Mac 风格文本框
class MacTextBox(TextBox):def input_text(self):print("在 Mac 风格文本框中输入文本")# 抽象工厂
class GUIFactory:def create_button(self):passdef create_textbox(self):pass# 具体工厂 - Windows 风格工厂
class WindowsGUIFactory(GUIFactory):def create_button(self):return WindowsButton()def create_textbox(self):return WindowsTextBox()# 具体工厂 - Mac 风格工厂
class MacGUIFactory(GUIFactory):def create_button(self):return MacButton()def create_textbox(self):return MacTextBox()# 客户端代码
def create_gui(factory):button = factory.create_button()textbox = factory.create_textbox()return button, textboxdef main():windows_gui = create_gui(WindowsGUIFactory())mac_gui = create_gui(MacGUIFactory())# 测试windows_button, windows_textbox = windows_guiwindows_button.click() # 输出: Windows 风格按钮被点击windows_textbox.input_text() # 输出: 在 Windows 风格文本框中输入文本mac_button, mac_textbox = mac_guimac_button.click() # 输出: Mac 风格按钮被点击mac_textbox.input_text() # 输出: 在 Mac 风格文本框中输入文本if __name__ == "__main__":main()
- 输出结果
Windows 风格按钮被点击
在 Windows 风格文本框中输入文本
Mac 风格按钮被点击
在 Mac 风格文本框中输入文本
单例模式
单例模式是一种创建型设计模式,它确保类只有一个实例,并提供一个全局访问点。
-
只有一个实例:单例模式确保一个类只有一个实例对象。
-
全局访问点:单例模式提供一个全局访问点,使得程序可以访问该实例。
场景
-
资源共享:当希望多个对象共享同一资源时,可以使用单例模式。例如,数据库连接池就是一个常见的单例模式的应用场景。
-
控制对象的数量:当希望限制类的实例化次数时,可以使用单例模式。例如,线程池就可以使用单例模式来控制线程的数量。
-
全局对象:当希望在整个系统中使用一个全局对象时,可以使用单例模式。例如,日志记录器、配置管理器等都可以使用单例模式来实现。
实现方式
- 懒汉式:在第一次调用时创建实例对象。
class Singleton:_instance = Nonedef __init__(self):if Singleton._instance is not None:raise ValueError("An instance of this class already exists")Singleton._instance = self@classmethoddef get_instance(cls):if cls._instance is None:cls._instance = cls()return cls._instance# 客户端代码
def main():# 创建两个实例,但它们实际上是同一个对象singleton1 = Singleton.get_instance()singleton2 = Singleton.get_instance()# 打印输出,可以看到两个实例具有相同的内存地址print(singleton1 is singleton2) # 输出: Trueif __name__ == "__main__":main()
- 饿汉式:在类加载时就创建实例对象。
class Singleton:_instance = Nonedef __new__(cls):if cls._instance is None:cls._instance = super().__new__(cls)return cls._instance# 客户端代码
def main():# 创建两个实例,但它们实际上是同一个对象singleton1 = Singleton()singleton2 = Singleton()# 打印输出,可以看到两个实例具有相同的内存地址print(singleton1 is singleton2) # 输出: Trueif __name__ == "__main__":main()
- 线程安全的单例模式:确保在多线程环境下仍然能够正常工作。
import threadingclass Singleton:_instance = None_lock = threading.Lock()def __new__(cls):if not cls._instance:with cls._lock:if not cls._instance:cls._instance = super().__new__(cls)return cls._instance# 客户端代码
def main():# 创建两个实例,但它们实际上是同一个对象singleton1 = Singleton()singleton2 = Singleton()# 打印输出,可以看到两个实例具有相同的内存地址print(singleton1 is singleton2) # 输出: Trueif __name__ == "__main__":main()
- 基于模块:使用 Python 模块系统的特性实现单例模式。
- singleton_module.py
class Singleton:value = Nonedef get_singleton():if Singleton.value is None:Singleton.value = Singleton()return Singleton.value
- client.py
import singleton_module# 客户端代码
def main():# 创建两个实例,但它们实际上是同一个对象singleton1 = singleton_module.get_singleton()singleton2 = singleton_module.get_singleton()# 打印输出,可以看到两个实例具有相同的内存地址print(singleton1 is singleton2) # 输出: Trueif __name__ == "__main__":main()
工厂方法模式
工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它定义了一个用于创建对象的接口,但将实际创建工作推迟到子类中。这样,工厂方法模式允许一个类在不改变其结构的情况下,改变它所实例化的具体类。
-
抽象产品(Abstract Product):定义了产品的接口,是工厂方法所创建对象的基类。
-
具体产品(Concrete Product):实现了抽象产品接口的具体对象。
-
抽象工厂(Abstract Factory):定义了创建产品的工厂方法的接口。
-
具体工厂(Concrete Factory):实现了抽象工厂接口的具体工厂类,负责创建具体产品对象。
场景
-
创建对象的具体类不是事先知道的:当一个类需要创建对象的具体类不是在编写代码时就能确定的,而是在运行时动态确定时,可以使用工厂方法模式。
-
避免直接依赖于具体类:工厂方法模式可以让客户端代码通过接口调用工厂方法来创建对象,而不需要直接依赖于具体类,从而降低了耦合度。
-
需要创建一组相关的对象:如果系统需要创建一组相关的对象,但具体的对象类型由子类决定,可以使用工厂方法模式来管理对象的创建。
-
需要扩展系统功能:工厂方法模式符合开闭原则,可以方便地扩展系统功能。当需要添加新的具体产品类时,只需要添加新的具体工厂类即可,不需要修改已有代码。
-
图形界面库:比如在 GUI 库中,根据不同的操作系统(如 Windows、MacOS、Linux)需要创建不同的按钮、文本框等组件对象。
-
数据库访问类库:在数据库访问类库中,根据不同的数据库(如 MySQL、PostgreSQL、SQLite)需要创建不同的连接对象。
-
日志记录器:在日志记录器中,根据不同的日志输出目标(如控制台、文件、数据库)需要创建不同的日志记录器对象。
示例
from abc import ABC, abstractmethod# 抽象产品 - 车
class Car(ABC):@abstractmethoddef drive(self):pass# 具体产品 - Toyota 车
class ToyotaCar(Car):def drive(self):print("驾驶 Toyota 车")# 具体产品 - Tesla 车
class TeslaCar(Car):def drive(self):print("驾驶 Tesla 车")# 抽象工厂
class CarFactory(ABC):@abstractmethoddef create_car(self):pass# 具体工厂 - Toyota 工厂
class ToyotaFactory(CarFactory):def create_car(self):return ToyotaCar()# 具体工厂 - Tesla 工厂
class TeslaFactory(CarFactory):def create_car(self):return TeslaCar()# 客户端代码
def drive_car(factory):car = factory.create_car()car.drive()def main():toyota_factory = ToyotaFactory()tesla_factory = TeslaFactory()drive_car(toyota_factory) # 输出: 驾驶 Toyota 车drive_car(tesla_factory) # 输出: 驾驶 Tesla 车if __name__ == "__main__":main()
- 输出结果
驾驶 Toyota 车
驾驶 Tesla 车
简单工厂模式
简单工厂模式(Simple Factory Pattern)是一种创建型设计模式,它提供了一种将对象的创建过程封装起来的方式。在简单工厂模式中,有一个工厂类负责根据客户端的需求创建相应的对象,而客户端无需知道具体的创建逻辑。
- 产品(Product):被创建的对象的基类或接口,它定义了产品的通用行为。
- 具体产品(Concrete Product):实现产品接口的具体对象。
- 工厂类(Factory):负责创建具体产品的类。客户端通过调用工厂类的方法来创建产品,而不直接实例化具体产品类。
场景
-
对象的创建逻辑相对简单:如果对象的创建逻辑比较简单,并且不太可能变化,可以考虑使用简单工厂模式。这样可以将对象的创建过程封装起来,使客户端代码更加简洁。
-
需要对客户端隐藏对象的创建细节:简单工厂模式可以隐藏对象的创建细节,客户端只需要知道如何向工厂类提供参数,而不需要了解对象是如何创建的。
-
需要根据不同的条件创建不同类型的对象:如果需要根据不同的条件来创建不同类型的对象,可以使用简单工厂模式。例如,根据用户输入的不同命令创建不同类型的工具对象。
-
对象的数量较少且稳定:如果需要创建的对象数量较少,并且这些对象的种类相对稳定,不太容易变化,可以考虑使用简单工厂模式。
示例
class Car:def __init__(self, brand):self.brand = brandclass CarFactory:def create_car(self, brand):if brand == "Toyota":return Car("Toyota")elif brand == "Tesla":return Car("Tesla")else:raise ValueError("未知车辆品牌")def main():# 创建车辆工厂car_factory = CarFactory()# 制造丰田车和特斯拉车toyota_car = car_factory.create_car("Toyota")tesla_car = car_factory.create_car("Tesla")# 打印输出结果print("丰田车品牌:", toyota_car.brand) # 输出: Toyotaprint("特斯拉车品牌:", tesla_car.brand) # 输出: Teslaif __name__ == "__main__":main()
- 输出结果
丰田车品牌: Toyota
特斯拉车品牌: Tesla
建造者模式
建造者模式(Builder Pattern)是一种创建型设计模式,它的主要目的是将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。
-
产品(Product):表示被构建的复杂对象。产品类通常包含多个部件,不同的建造者可以构建不同的产品对象。
-
抽象建造者(Builder):定义了构建产品对象的抽象接口,包括创建各个部件的方法。
-
具体建造者(Concrete Builder):实现了抽象建造者接口,负责构建产品对象的各个部件,并将这些部件组装成最终的产品对象。
-
指挥者(Director):负责使用建造者对象构建产品对象的方法。指挥者通常包含一个构建方法,该方法接收一个建造者对象作为参数,然后根据具体的构建过程调用建造者的方法来构建产品对象。
场景
-
创建复杂对象:当一个对象包含多个部分,且构建过程比较复杂时,可以使用建造者模式。通过将构建过程分解成多个步骤,并由不同的建造者负责构建不同的部分,可以简化对象的构建过程。
-
对象的构建过程需要灵活性:当需要灵活地控制对象的构建过程,并且可以根据不同需求创建不同的表示时,可以使用建造者模式。通过定义不同的具体建造者,可以创建不同表示的产品对象。
-
创建对象的过程需要复用:当需要复用相同的构建过程来创建不同的对象时,可以使用建造者模式。通过复用相同的构建过程,可以提高代码的复用性和可维护性。
-
创建复杂的文档对象:例如,一个文档对象可能包含标题、正文、图像、表格等多个部分,不同类型的文档可能具有不同的部件组成,可以使用建造者模式来构建不同类型的文档对象。
-
创建复杂的菜单对象:例如,一个菜单对象可能包含多个菜品、饮料、甜点等多个部分,可以使用建造者模式来构建不同类型的菜单对象,如午餐菜单、晚餐菜单、酒水菜单等。
示例
# 产品 - 电脑
class Computer:def __init__(self):self.case = Noneself.cpu = Noneself.memory = Noneself.hard_drive = Noneself.graphics_card = Nonedef __str__(self):info = (f"电脑配置:\n"f"机箱:{self.case}\n"f"CPU:{self.cpu}\n"f"内存:{self.memory}\n"f"硬盘:{self.hard_drive}\n"f"显卡:{self.graphics_card}")return info# 抽象建造者
class ComputerBuilder:def __init__(self):self.computer = Computer()def build_case(self):passdef build_cpu(self):passdef build_memory(self):passdef build_hard_drive(self):passdef build_graphics_card(self):pass# 具体建造者 - 游戏电脑
class GamingComputerBuilder(ComputerBuilder):def build_case(self):self.computer.case = "大型塔式机箱"def build_cpu(self):self.computer.cpu = "i9-9900K"def build_memory(self):self.computer.memory = "32GB DDR4"def build_hard_drive(self):self.computer.hard_drive = "1TB SSD + 2TB HDD"def build_graphics_card(self):self.computer.graphics_card = "RTX 3080"# 指挥者
class Director:def __init__(self, builder):self.builder = builderdef construct_computer(self):self.builder.build_case()self.builder.build_cpu()self.builder.build_memory()self.builder.build_hard_drive()self.builder.build_graphics_card()def get_computer(self):return self.builder.computer# 客户端代码
def main():gaming_builder = GamingComputerBuilder()director = Director(gaming_builder)director.construct_computer()gaming_computer = director.get_computer()print(gaming_computer)if __name__ == "__main__":main()
- 输出结果
电脑配置:
机箱:大型塔式机箱
CPU:i9-9900K
内存:32GB DDR4
硬盘:1TB SSD + 2TB HDD
显卡:RTX 3080
原型模式
原型模式(Prototype Pattern)是一种创建型设计模式,它通过复制现有对象来创建新对象,而不是通过实例化新对象。在原型模式中,一个原型对象充当了新对象的模板,新对象通过复制原型对象来初始化,并可以根据需要进行修改。
-
简化对象创建:原型模式通过复制现有对象来创建新对象,避免了使用构造函数和初始化参数的复杂性。
-
提高性能:与直接实例化对象相比,通过复制现有对象创建新对象通常更快。
-
允许动态配置对象:新对象可以根据需要对原型对象进行修改,以满足不同的需求。
场景
-
对象的创建成本高:当对象的创建成本较高,或者对象的创建过程比较复杂时,可以使用原型模式。通过复制现有对象来创建新对象,可以节省创建对象的时间和资源成本。
-
需要创建多个相似对象:当需要创建多个相似但不完全相同的对象时,可以使用原型模式。原型模式允许在现有对象的基础上进行修改和定制,从而快速创建多个相似对象。
-
避免构造函数的复杂性:当对象的构造函数包含复杂的初始化逻辑或参数时,可以使用原型模式来避免构造函数的复杂性。通过复制现有对象来创建新对象,可以避免使用构造函数和初始化参数。
-
需要动态配置对象:当需要根据不同的需求动态配置对象时,可以使用原型模式。原型模式允许在创建新对象时根据需要对现有对象进行修改和定制,从而满足不同的需求。
-
缓存对象:原型模式可以用于缓存已创建的对象,避免重复创建相同的对象,提高性能和效率。
-
深拷贝对象:原型模式可以用于执行深拷贝操作,创建一个与现有对象相同但不同实例的对象。
-
创建测试数据:原型模式可以用于创建测试数据,快速创建多个相似但不完全相同的对象用于测试。
示例
import copyclass Prototype:def __init__(self):self._objects = {}def register_object(self, name, obj):self._objects[name] = objdef unregister_object(self, name):del self._objects[name]def clone(self, name, **attrs):obj = copy.deepcopy(self._objects.get(name))obj.__dict__.update(attrs)return objclass Car:def __init__(self):self.make = "Toyota"self.model = "Camry"self.year = 2020def __str__(self):return f"{self.year} {self.make} {self.model}"# 客户端代码
def main():prototype = Prototype()# 注册原型对象car = Car()prototype.register_object("car", car)# 克隆对象并修改属性cloned_car = prototype.clone("car", year=2021)print(cloned_car) # 输出: 2021 Toyota Camryif __name__ == "__main__":main()
- 输出结果
2021 Toyota Camry
相关文章:
Python 设计模式(创建型)
文章目录 抽象工厂模式场景示例 单例模式场景实现方式 工厂方法模式场景示例 简单工厂模式场景示例 建造者模式场景示例 原型模式场景示例 抽象工厂模式 抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一种将一组相关…...
PyTorch 索引与切片-Tensor基本操作
以如下 tensor a 为例,展示常用的 indxing, slicing 及其他高阶操作 >>> a torch.rand(4,3,28,28) >>> a.shape torch.Size([4, 3, 28, 28])Indexing: 使用索引获取目标对象,[x,x,x,....] >>> a[0].shape torch.Size([3, 2…...

深入浅出 LangChain 与智能 Agent:构建下一代 AI 助手
我们小时候都玩过乐高积木。通过堆砌各种颜色和形状的积木,我们可以构建出城堡、飞机、甚至整个城市。现在,想象一下如果有一个数字世界的乐高,我们可以用这样的“积木”来构建智能程序,这些程序能够阅读、理解和撰写文本…...
scss是什么安装使⽤的步骤
当谈到SCSS时,我们首先需要了解它是什么。SCSS,也称为Sassy CSS,是Sass(Syntactically Awesome Stylesheets)的一种语法,它是CSS的预处理器,允许你使用变量、嵌套规则、混合(mixin&a…...
Pspark从hive读数据写到Pgsql数据库
前提条件 要使用PySpark从Hive读取数据并写入到PostgreSQL数据库,你需要确保以下几点: 你的PySpark环境已经配置好,并且能够连接到你的Hive数据。 PostgreSQL JDBC驱动程序已经添加到你的PySpark环境中。 你已经在PostgreSQL中创建好了相应…...

Pixi.js学习 (六)数组
目录 前言 一、数组 1.1 定义数组 1.2 数组存取与删除 1.3 使用数组统一操作敌机 二、实战 例题一:使用数组统一操作敌机 例题一代码: 总结 前言 为了提高作者的代码编辑水品,作者在使用博客的时候使用的集成工具为 HBuilderX。 下文所有截…...

操作系统复习-Linux的文件系统
文件系统概述 FAT FAT(File Allocation Table)FAT16、FAT32等,微软Dos/Windows使用的文件系统使用一张表保存盘块的信息 NTFS NTFS (New Technology File System)WindowsNT环境的文件系统NTFS对FAT进行了改进,取代了日的文件系统 EXT EXT(Extended…...

代码随想录算法训练营第三十六天| 860.柠檬水找零、 406.根据身高重建队列、 452. 用最少数量的箭引爆气球
LeetCode 860.柠檬水找零 题目链接:https://leetcode.cn/problems/lemonade-change/description/ 文章链接:https://programmercarl.com/0860.%E6%9F%A0%E6%AA%AC%E6%B0%B4%E6%89%BE%E9%9B%B6.html 思路 贪心算法:遇见20的时候有两种找零的…...
如何在C#中实现多线程
在C#中实现多线程有多种方式,包括使用System.Threading.Thread类、System.Threading.Tasks.Task类、System.Threading.Tasks.Parallel类以及异步编程模型(async和await)。下面我将为你展示每种方法的基本用法。 1. 使用System.Threading.Thread类 using System; using Syst…...

【LLM】快速了解Dify 0.6.10的核心功能:知识库检索、Agent创建和工作流编排(二)
【LLM】快速了解Dify 0.6.10的核心功能:知识库检索、Agent创建和工作流编排(二) 文章目录 【LLM】快速了解Dify 0.6.10的核心功能:知识库检索、Agent创建和工作流编排(二)一、创建一个简单的聊天助手&#…...

【介绍下Pandas,什么是Pandas?】
🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…...

linux系统安装anaconda,并通过java程序调用python程序
虚拟环境准备 首先准备一块空的分区,安装anaconda至少要20g以上才能执行简单程序,这里准备20G的磁盘空间 创建分区,执行以下步骤,之后执行reboot重启 fdisk /dev/sda p n 回车 回车 w查看当前系统创建的分区,我这里是名为sda3的…...

Stable diffusion的SDXL模型,针不错!(含实操)
与之前的SD1.5大模型不同,这次的SDXL在架构上采用了“两步走”的生图方式: 以往SD1.5大模型,生成步骤为 Prompt → Base → Image,比较简单直接;而这次的SDXL大模型则是在中间加了一步 Refiner。Refiner的作用是什么呢…...

wordpress轻量免费主题
WordPress建站公司 适合提供WordPress建站服务的公司或个体(个人)工作室使用的WordPress建站公司主题模板。 https://www.jianzhanpress.com/?p545 首屏大图红色简洁wordpress主题 首屏大图红色简洁wordpress主题,非常地高端大气上档次,可用于多个行…...
Go AfterFunc 不触发
前言 函数原型为: func AfterFunc(d Duration, f func()) *TimerGo 的 time.AfterFunc 的作用是等待指定的时间间隔,然后在它自己的 goroutine 中调用 f。 现在有一个问题,我明明调用了 AfterFunc,但是它还没调用我指定的函数&…...

小程序视图渲染数据和部分事件的绑定
今天依旧使用这个目录进行教学 数据的渲染 在 index.js的 page中定义一个data对象结构是这样的 Page({data:{name:张三} }) 在index.wxml 中 利用模板语法进行渲染 <view >{{name}}</view> 注意这个模板里边不能使用js的方法 要循环渲染数组,如 在…...

“探索AIGC市场:腾讯元宝APP加入竞争,大模型产品的未来走向与个人选择“
文章目录 每日一句正能量前言使用体验分享独特优势和倾向选择字节豆包百度文心一言阿里通义千问腾讯元宝个人倾向选择结论 未来发展方向技术创新可持续可拓展性用户体验应用场景政府赋能数据安全与隐私保护伦理与社会责任国际合作与竞争结论 后记 每日一句正能量 不管现在有多么…...
node设置镜像源详细教程
在Node.js环境中,你可以通过设置npm或yarn的镜像源来加速依赖包的下载。以下是如何设置npm和yarn的镜像源的详细步骤: 使用npm设置镜像源 临时设置镜像源: 你可以在安装包时临时指定镜像源,例如: npm install package…...

四季变换,制氮机使用注意事项
随着四季的轮回变换,大自然展现着不同的风貌。对于制氮机而言,季节的变换同样会带来不同的使用挑战和注意事项。本文将为您揭示四季变换对制氮机使用的影响,帮助您更好地掌握制氮机的季节使用须知。 春季 温湿度变化:春季温湿度逐…...

如何实现办公终端安全
在网络安全日益严峻的当下,可信白名单作为一种高效的终端安全防护手段,正在逐渐受到业界的广泛关注和应用。本文将简要探讨可信白名单如何实现终端安全的原理、方法及其在实际应用中的优势与挑战。 首先,我们需要了解可信白名单的基本原理。可…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...

自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...