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…...
四季变换,制氮机使用注意事项
随着四季的轮回变换,大自然展现着不同的风貌。对于制氮机而言,季节的变换同样会带来不同的使用挑战和注意事项。本文将为您揭示四季变换对制氮机使用的影响,帮助您更好地掌握制氮机的季节使用须知。 春季 温湿度变化:春季温湿度逐…...
如何实现办公终端安全
在网络安全日益严峻的当下,可信白名单作为一种高效的终端安全防护手段,正在逐渐受到业界的广泛关注和应用。本文将简要探讨可信白名单如何实现终端安全的原理、方法及其在实际应用中的优势与挑战。 首先,我们需要了解可信白名单的基本原理。可…...
【云岚到家】-day01-项目熟悉-查询区域服务开发
文章目录 1 云岚家政项目概述1.1 简介1.2 项目业务流程1.3 项目业务模块1.4 项目架构及技术栈1.5 学习后掌握能力 2 熟悉项目2.1 熟悉需求2.2 熟悉设计2.2.1 表结构2.2.2 熟悉工程结构2.2.3 jzo2o-foundations2.2.3.1 工程结构2.2.3.2 接口测试 3 开发区域服务模块3.1 流程分析…...
Docker面试整理-如何进行Docker镜像的构建和发布?
构建和发布 Docker 镜像是 Docker 使用中的一个常见任务,通常涉及编写 Dockerfile、构建镜像以及将其推送到镜像仓库的过程。以下是构建和发布 Docker 镜像的详细步骤: 1. 编写 Dockerfile 首先,你需要创建一个 Dockerfile,这是一个包含了一系列指令的文本文件,用来告诉 D…...
macOS Sequoia 将 Mac 生产力与智能化提升至全新高度 (macOS 15 ISO、IPSW、PKG 下载)
macOS Sequoia 将 Mac 生产力与智能化提升至全新高度 (macOS 15 ISO、IPSW、PKG 下载) iPhone 镜像、Safari 浏览器重大更新、备受瞩目的游戏和 Apple Intelligence 等众多全新功能令 Mac 使用体验再升级 请访问原文链接:https://sysin.org/blog/macOS-Sequoia/&a…...
用户管理与服务器远程管理
用户管理 服务器系统版本介绍 windows服务器系统:win2000 win2003 win2008 win2012 linux服务器系统:Redhat Centos 用户管理 用户概述 (1)每一个用户登录系统后,拥有不同的操作权限。 (2)…...
Pytorch 实现简单的 线性回归 算法
Pytorch实现简单的线性回归算法 简单 tensor的运算 Pytorch涉及的基本数据类型是tensor(张量)和Autograd(自动微分变量) import torch x torch.rand(5, 3) #产生一个5*3的tensor,在 [0,1) 之间随机取值 y torch.o…...
Django中配置日志
在Django中配置日志的方法非常简单,只需要在 setting 文件中添加配置项,系统会自动生成相应的日志文件,也可以配置调试时显示内容,报错发送邮件等操作。 在setting.py中添加以下配置。 # 日志配置 LOGS_DIRS os.path.join(BASE…...
海外盲盒小程序背后的技术支撑与实现
海外盲盒小程序之所以能够迅速崛起并受到全球消费者的喜爱,除了其独特的商业模式和营销策略外,更重要的是其背后的技术支撑和实现。本文将深入探讨海外盲盒小程序背后的技术支撑及其实现方式。 一、多语言与本地化技术 为了满足全球不同地区消费者的需…...
vue问题记录
vue3 路由跳转携带参数 路由跳转携带参数 query方法 //跳转传参 this.$router.push({path:/home,query: {id:1}}) //接受参数 this.$route.query.id问题:刷新页面,参数会丢失—未解决 将参数存在本地存储中,但是组件销毁时,清…...
Flutter - Material3适配
demo 地址: https://github.com/iotjin/jh_flutter_demo 代码不定时更新,请前往github查看最新代码 Flutter - Material3适配 对比图具体实现一些组件的变化 代码实现Material2的ThemeDataMaterial3的ThemeData Material3适配官方文档 flutter SDK升级到3.16.0之后 …...
一个有趣的c++案例
1. 源码 #include <stdio.h> #include <stdint.h> #include <iostream>using namespace std;uint8_t a 0; uint8_t b 0;#define MY_LOG#ifdef MY_LOG#define my_log(...) printf(__VA_ARGS__); fflush(stdout)#else #define my_log(...) #endifvoid …...
腾达建设哪里的/整站优化方案
rsync 学习 参考 http://www.cnblogs.com/itech/archive/2009/08/10/1542945.html 模式1 本地直接拷贝, 这个其实是调用了 cp 命令, 跟 rsync 服务器, 客户端无关。 /usr/myapp/logs 是本地日志目录 rsync /usr/myapp/logs /usr/myapp/logs2 …...
大型网站制作流程/搜索网页内容
接着上篇《编写高效Excel VBA代码的最佳实践(一)》 尽可能少使用“.”,使用对象变量 在前面已经介绍过的对长对象引用使用对象变量以及使用With…End With等都是简化”.”的方法。因为在代码中的每个句点都表示至少一个(而且可能是多个)过程调用,而这些过…...
湛江网站建设外包/seo专业实战培训
摘要:虚拟机Apache设置很多用户都遇到过,具体如何进行虚拟机Apache设置?怎样才能让虚拟机Apache设置达到最简单,最优化?本文为您讲解。Apache虚拟机设置有两种方法: 基于主机名的虚拟主机(一个IP地址&#…...
专业做网站价格/上海seo优化公司 kinglink
1.设置ReduceTask并行度(个数)reducetask的并行度同样影响整个job的执行并发度和执行效率,但与maptask的并发数由切片数决定不同,Reducetask数量的决定是可以直接手动设置://默认值是1,手动设置为4job.setN…...
网站怎么做动态图片/企业推广方式有哪些
一、通用函数: colorbar 显示彩色条 语法:colorbar \ colorbar(vert) \ colorbar(horiz) \ colorbar(h) \ hcolorbar(...) \ colorbar(...,peer,axes_handle) getimage 从坐标轴取得图像数据 语法:Agetimage(h) \ [x,y,A]getimage(h) \ [...…...
手机复制链接提取视频的软件/seo研究协会网app
背景 有这样一个需求,一位 React Suite(以下简称 rsuite)的用户,他需要一个 Table 组件能够像 Jira Portfolio 一样,支持树形数据,同时需要支持大数据渲染。 截止到目前(2019年1月17日ÿ…...