自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(73)
  • 收藏
  • 关注

原创 lua table删除

2023-09-08 14:47:50 332

原创 除了堆和栈之外,计算机系统中还有哪些其他形式的内存存储?

栈(Stack):用于存储局部变量和函数调用的上下文信息。栈是一种后进先出(LIFO)的数据结构,每个函数调用时会在栈上创建一个新的栈帧,函数返回时栈帧被弹出。寄存器:位于CPU内部的高速缓存,用于存储和访问最频繁使用的数据和指令。除了堆和栈之外,计算机系统中还有其他形式的内存存储。静态存储区:用于存储全局变量和静态变量,这些变量在程序的整个运行期间都存在。堆的大小可以根据需要动态增长或缩小。常量存储区:用于存储常量数据,例如字符串常量和全局常量。程序代码区:用于存储程序的执行代码,包括指令和函数。

2023-06-15 22:40:58 449

原创 C# new与malloc

这些操作确保对象的成员变量和方法得到正确的初始化,并提供了对象使用所需的初始状态。基类成员的初始化会调用基类的构造函数,而派生类新增的成员则可以在派生类的构造函数中初始化。关键字进行一些优化,例如对象池的使用或内存布局的优化。构造函数是一个特殊的成员方法,用于初始化对象的状态和执行必要的操作。等底层内存分配方法一般用于与非托管代码的交互或特殊情况下的性能优化,需要谨慎使用,并确保正确地管理内存的分配和释放。关键字来进行对象的实例化和内存的分配,因为它提供了更高级别的内存管理和自动垃圾回收。

2023-06-14 11:16:27 1623

原创 unity Lua热更新原理

Unity中的Lua热更新是指在游戏运行过程中,可以动态更新Lua脚本代码,而无需重新编译整个游戏项目。一般情况下,初始时会加载本地的Lua脚本文件,随后在需要更新时,通过资源管理系统下载服务器上的最新Lua脚本文件。这些库提供了在游戏运行时执行Lua脚本的功能。总的来说,Unity中实现Lua热更新的原理就是利用Lua解释器和资源管理系统,实现动态加载和执行最新的Lua脚本文件,从而实现游戏的更新和功能扩展。更新Lua脚本:当有新的Lua脚本文件可用时,通过资源管理系统将新的Lua脚本文件下载到本地。

2023-06-14 10:21:31 384

原创 C#有序的map和无序的map实现上的区别,无序map怎么处理哈希冲突的,红黑树

在C#中,有序的Map和无序的Map在实现上有一些区别。红黑树的特点是具有较好的平衡性能,插入、删除和查找的平均时间复杂度为O(log n),其中n是树中元素的个数。链地址法(Chaining):每个槽位维护一个链表或其他数据结构,当发生哈希冲突时,将冲突的键值对添加到对应槽位的链表中。在处理哈希冲突方面,有序的Map不需要考虑哈希冲突,因为它使用的是平衡二叉搜索树,其中键是根据顺序进行排序的,而不是根据哈希值。而无序的Map使用哈希表来存储键值对,哈希表根据键的哈希值将键值对分散到不同的槽位中。

2023-06-09 09:34:16 1591

原创 Unity 粒子系统

可以通过编辑器界面或编写脚本来设置和调整粒子的属性和行为,并与其他功能模块进行交互和控制,实现更复杂和多样化的粒子效果。粒子的生命周期和衰减(Particle Lifecycle and Decay):粒子具有生命周期,可以设置粒子的寿命和衰减效果。通过调整粒子的生命周期和衰减参数,可以控制粒子的持续时间、逐渐消失的效果等。粒子发射器(Particle Emitter):粒子发射器是粒子系统的核心组件,用于发射和控制粒子的生成和发射。通过调整发射器的参数,可以控制粒子的初始位置、速度、方向、发射速率等。

2023-05-17 13:04:26 606

原创 unity 动画系统

Unity动画系统是Unity中非常重要的一部分,它提供了一个强大的框架来实现动画。Unity动画系统可以处理几乎所有的动画需求,从简单的2D动画到复杂的3D动画。Unity动画系统的核心是动画剪辑(Animation Clip)。动画剪辑是一个存储动画数据的文件,其中包含动画的关键帧数据、曲线信息和其他与动画相关的设置。使用Unity的编辑器可以创建和编辑动画剪辑,也可以使用代码进行创建和编辑。Unity动画系统的基本工作流程是创建一个动画剪辑,然后将其与游戏对象的动画组件相关联。

2023-05-17 13:04:02 678

原创 Unity阴影(Shadow)、Shadowmap

需要注意的是,阴影的计算和渲染是相对消耗资源的操作,对于性能要求较高的场景,需要进行适当的优化和权衡,例如降低阴影的分辨率、限制阴影的投射范围或使用静态预计算的方法。级联阴影图(Cascade Shadow Maps):用于近距离和远距离阴影投射效果不同的场景,将远处物体的阴影分为多个级联阴影贴图,以提高阴影的质量和细节。阴影可以增加场景的真实感,并在视觉上提供深度和空间感。阴影遮罩(Shadow Masks):使用阴影遮罩技术,通过在场景中创建特定的遮罩对象,限制阴影的投射范围,从而优化实时阴影的性能。

2023-05-17 13:02:12 1757

原创 Unity Light(光源)、LightMap、Light Probes

使用Light组件可以为场景中的物体增加逼真的光照效果,提高场景的真实感。在使用Light组件时,可以设置光源的颜色、强度、阴影等属性,以及光照的范围和衰减等参数。需要注意的是,使用光照效果可能会对性能产生一定的影响,特别是在移动设备等资源有限的平台上。Directional Light(方向光):模拟远处的太阳光或月光,光线是平行的,不受位置影响,常用于模拟白天或夜晚的整体光照。Point Light(点光源):从一个点向四面八方发射光线,模拟点光源,例如灯泡、蜡烛等,可以产生辐射状的光照效果。

2023-05-17 12:59:01 954

原创 C# 性能优化和Unity性能优化

使用并发集合:如果需要处理并发的数据结构,可以使用 .NET Framework 中提供的并发集合,例如 ConcurrentDictionary、ConcurrentQueue 等等。例如,如果需要频繁地插入和删除元素,那么链表比数组更适合,因为链表的插入和删除操作比数组更快。避免使用反射:反射是一个非常强大的工具,但它的使用会导致性能损失。如果需要在循环中创建对象,应该尽量重用对象,或者使用对象池。总之,C# 性能优化是一个需要综合考虑的问题,需要从各个方面入手,不断优化代码,提高性能。

2023-05-16 21:12:54 1266

原创 C#面向对象的概念

C#是一种面向对象的编程语言,面向对象编程的核心是将程序中的数据和操作封装在一个对象中。下面是一些面向对象的概念:类(Class):类是用来描述一类对象的属性和方法的模板或蓝图,它定义了一组属性和方法,是创建对象的基础。类可以被继承,从而创建新的类。对象(Object):对象是类的一个实例,它具有类所定义的属性和方法。对象可以调用类中的方法和属性。封装(Encapsulation):封装是一种隐藏对象实现细节的机制,将对象的状态和行为包装在一起,对外只提供公共接口。

2023-05-09 13:10:08 1363

原创 C#迭代器

C#迭代器(Iterator)是一种特殊的方法,它允许您遍历集合中的元素,而无需暴露集合的实现细节。迭代器使您能够在不知道序列的完整长度的情况下遍历序列。使用迭代器的好处之一是它可以大大减少内存消耗,因为它不需要在内存中存储整个集合。此外,迭代器还允许您延迟计算,直到需要处理集合的元素时才进行计算。语句告诉编译器,在每次迭代时返回一个元素,并暂停方法的执行状态,等待下一次迭代。使用迭代器时,可以像枚举器一样遍历序列。的方法,它接受一个字符串参数并返回一个。循环来遍历字符串中的每个字符,并使用。

2023-05-09 12:54:37 273

原创 Unity上线部署与发布

发布游戏:一旦游戏通过测试并且准备好发布,就可以将发布包上传到目标平台的应用商店或其他发布渠道,例如Google Play、App Store等。调整项目设置:在Unity编辑器中,需要进行一些项目设置的调整以确保项目能够在目标平台上正常运行,例如调整分辨率、屏幕适配、平台特定的设置等。测试和优化:在将发布包发布到目标平台之前,需要进行测试和优化,以确保游戏在目标平台上能够正常运行,这可以包括性能测试、兼容性测试、UI测试等。构建发布包:在Unity编辑器中选择目标平台,进行构建,并生成一个发布包。

2023-05-07 14:34:22 773

原创 Unity PlayerPrefs、JsonUtility

JsonUtility是Unity内置的一个用于序列化和反序列化Json数据的工具,可用于存储和读取复杂的游戏数据,如游戏设置、存档等。PlayerPrefs是Unity内置的一种轻量级数据存储方式,可用于存储少量的游戏数据,如分数、解锁状态等。注意:使用JsonUtility存储和读取数据时,需要将数据转换为Json格式的字符串,并将其保存在本地文件中,因此需要注意数据的安全性和完整性。Unity中有两个常用的数据存储方式:PlayerPrefs和JsonUtility。

2023-05-07 12:15:18 1066

原创 Unity中常见的脚本生命周期函数及顺序

需要注意的是,这个顺序并不是严格的,有些函数会在特定条件下被调用,例如OnGUI()只会在有GUI时才会被调用。同时,如果有多个脚本附加在同一个GameObject上,它们的生命周期函数也会按照某种顺序进行调用,但这个顺序是不确定的,因此应该尽量避免在不同的脚本中使用相互依赖的生命周期函数。LateUpdate():在 Update 之后调用,用于在 Update 逻辑执行完成后进行一些额外的操作。Awake():当对象被创建时调用,用于初始化对象的引用和状态。

2023-04-27 08:12:29 2034

原创 unity XML进行文件读写

XML(可扩展标记语言)是一种用于存储和传输数据的标记语言,它可以将数据存储在文本文件中,以便于读取和处理。总的来说,XML 文件读写可以方便地存储和读取数据,但相对来说可能会比较慢,因为需要进行序列化和反序列化操作。上面的代码创建了一个 PlayerData 对象,然后使用 XML 序列化器将该对象写入 XML 文件中。需要注意的是,这里的文件路径是在应用程序目录下创建的。上面的代码从 XML 文件中读取了一个 PlayerData 对象,并输出了该对象的属性值。

2023-04-26 19:05:06 839

原创 C# static 实现的静态类与单例的优劣比较

静态类是一个只包含静态成员的类,不能被实例化,因为其所有成员都是静态的,所以它们在内存中只会存在一份。静态类的优势在于使用方便,不需要实例化就可以调用其中的方法和属性,且不需要考虑线程安全等问题。单例模式的优势在于可以通过实例化来访问类的成员,避免了静态成员可能存在的一些问题,例如代码可维护性、可测试性等。在实现全局共享时,静态类和单例模式都可以起到类似的作用,但是静态类更适用于实现一些通用的、不需要状态维护的功能,而单例模式更适用于保存应用程序状态的情况。在使用时,应根据实际需要来选择使用哪种方式。

2023-04-25 12:24:50 709

原创 C# 内存池

当需要内存时,可以使用 Rent() 方法从内存池中获取一个内存块,使用完毕后再将其归还到内存池中,以便下一次使用。C# 内存池是一种高效的内存管理技术,它通过事先分配一定数量的内存,然后在需要时从内存池中获取空闲的内存,使用完毕后再将其归还到内存池中,以便下一次使用。与传统的内存分配方式不同,内存池避免了频繁的内存分配和回收,从而提高了程序的性能和稳定性。总之,内存池是一种非常有用的技术,可以提高程序的性能和稳定性,特别是在需要频繁地分配和释放内存的场景中。

2023-04-25 12:24:00 860

原创 c# 结构体与类区别

性能不同:由于结构体的实例被分配在栈上,所以在一些情况下,使用结构体比使用类更高效,比如在大量创建小对象时。但是,结构体也有一些限制,比如它的大小不能超过 16KB。针对默认构造函数的处理不同:结构体默认有一个无参的构造函数,而类如果没有显式定义构造函数,就会默认有一个无参的构造函数。内存分配方式不同:结构体是值类型,它的实例被分配在栈上,而类是引用类型,它的实例被分配在堆上。赋值方式不同:结构体赋值时是按值传递,即会复制一份,而类赋值时是按引用传递,即会复制一个引用。关键字定义,而类使用。

2023-04-25 09:47:20 1404 2

原创 C# string和char[]相互 转换

需要注意的是,在转换过程中,会创建新的对象并分配新的内存,因此如果在处理大量数据时,需要谨慎使用这些转换操作。之间的相互转换来实现字符串和字符数组之间的转换。在 C# 中,可以通过。

2023-04-24 13:51:53 1808

原创 C# A*算法

A*算法是一种广泛使用的路径搜索算法,通常用于寻找在给定地图或图形中,起点到目标点之间的最短路径。它是一种基于贪心策略的启发式搜索算法,可以在大多数情况下找到最短路径。

2023-04-24 13:51:44 1480

原创 C# ref/out

具体而言,如果一个方法的参数被声明为ref类型,则该参数必须在调用方法之前被初始化。需要注意的是,调用方法时也必须使用ref关键字,以便让编译器知道这个参数是按引用传递的。在方法内部,必须对该变量进行初始化。与ref不同,out关键字可以让方法在调用之前对变量进行初始化,这对于一些需要返回多个值的方法非常有用。需要注意的是,调用方法时也必须使用out关键字,以便让编译器知道这个参数是按引用传递的。总的来说,ref和out都可以用于修改调用者传递进来的变量的值,但使用时需要注意它们的具体语义和限制。

2023-04-24 13:51:38 109

原创 C# 哈希表Hashtable

然后,通过Add方法向哈希表中添加元素,键值对分别为“key1”和“value1”、“key2”和“value2”、“key3”和“value3”。接着,通过哈希表的索引器,获取了键“key1”和“key2”对应的值,并更新了键“key3”对应的值。以上示例中,通过创建Hashtable对象,添加了三个键值对,分别为"name"和"Alice"、"age"和20、"city"和"New York"。接着,使用索引器通过键获取值,修改键对应的值,并使用Remove方法删除键值对。

2023-04-24 13:51:31 951

原创 C# 进程

在这个示例中,我们使用 Process 类启动了一个 Notepad 进程,并等待它退出。首先,我们创建了一个 Process 实例,然后设置了它的 FileName 属性为 "notepad.exe"。然后,我们输出了进程的 ID,并调用 WaitForExit 方法等待进程退出。最后,我们输出了进程退出时的状态码。进程(Process)是计算机中的一个术语,指的是正在执行的程序实例。在操作系统中,每个进程都有自己的地址空间、内存、数据栈和代码段等资源,以及一些控制信息,如进程优先级、状态等。

2023-04-24 13:51:25 256

原创 Unity的渲染

Unity的渲染是通过使用Graphics API(Graphics Processing Interface)来实现的,常见的API有OpenGL和Direct3D。在Unity中,渲染管线(Render Pipeline)负责渲染场景,其中包括三个主要阶段:几何体处理(Geometry Processing),光照计算(Shading)和输出(Output)。在几何体处理阶段,Unity会根据场景中所有的3D模型、粒子、天空盒等等来生成一个场景中的三角形网格(Mesh)。

2023-04-24 13:50:54 3490

原创 Lua(元表,面向对象)

元表中可以定义一些元方法(metatable),当某些特定的操作发生在一个表上时,Lua会去元表中寻找对应的元方法并执行它。例如,可以通过设置元表来重载表的索引操作,使得当一个表不存在某个元素时,可以自动返回一个默认值。在这个例子中,定义了一个基类BaseClass和一个子类DerivedClass,子类继承了基类的属性和方法,并可以重载方法。在Lua中,面向对象编程通常通过表来实现,一个表可以作为一个对象,表中的字段可以作为对象的属性,表中的函数可以作为对象的方法。同时,元表可以用于实现继承和多态。

2023-04-24 13:50:06 261

原创 C#和lua、C和C++

总的来说,C++在C语言的基础上增加了面向对象编程的特性和更多的库支持,使得它能够更方便地开发大型项目。在游戏开发中,C#主要用于编写客户端和服务端的底层逻辑,而Lua主要用于编写游戏脚本和AI逻辑等。C和C++都是一种通用的编程语言,它们有许多共同点,但也有一些不同之处。C#的性能很高,可以编写高效的程序,适合编写游戏客户端、服务端等应用。C#有着丰富的语法和强大的面向对象特性,可以完成各种复杂的开发任务。Lua有着简洁的语法和灵活的设计,可以在不同的领域进行扩展和应用。

2023-04-24 13:49:29 989

原创 C# 装箱拆箱

拆箱:将引用类型转换为值类型的过程,会将对象中存储的值复制到一个新的值类型中。值类型的可空类型:值类型的可空类型是一种特殊的引用类型,它可以包装一个值类型的值,并允许存储null值。是int类型的可空类型,它可以存储int类型的值或null值,而不需要装箱和拆箱。装箱:将值类型转换为引用类型的过程,会创建一个对象,这个对象存储在堆中,同时将值类型的值复制到这个对象中。例如,List<int>是一个泛型类型,它可以在运行时存储int类型的值,而不需要装箱和拆箱。可以使用泛型和值类型的可空类型来避免这种开销。

2023-04-21 14:49:33 403

原创 Unity 数据管理(整个游戏的数据怎么管理,数据系统怎么设计)

高性能:考虑到游戏数据系统需要支持高并发的访问,需要采用高性能的数据存储方案,比如采用内存数据库、缓存等方式,提高系统的性能。数据一致性:保证不同的数据操作之间的一致性,比如数据的写入和读取操作需要互斥,防止数据出现脏读或不可重复读等问题。数据缓存:为了提高游戏的性能,通常需要将游戏数据进行缓存,比如将常用的数据放在内存中,减少数据库读写操作。除此之外,还需要考虑数据的版本控制、数据的迁移、数据的验证等问题,以保证数据的质量和稳定性。

2023-04-21 14:49:31 1423

原创 C# GC垃圾回收、智能指针

在C#中,开发人员不必再手动地去管理内存,也不需要关心对象的生命周期和销毁,而是由GC在程序运行时自动完成这些操作。总之,C#中的垃圾回收是一种自动管理内存的机制,它可以让开发人员专注于业务逻辑,而不用过多地关注内存管理。同时,为了优化GC性能,开发人员需要了解GC的工作原理,并采取相应的措施进行优化。在C#中,GC负责自动回收不再使用的内存对象,并使其可用于新的内存分配。虽然GC的工作是自动的,但是在某些情况下,手动触发GC可以提高程序的性能。将大的对象转换为小的对象,避免大对象直接进入LOH;

2023-04-21 14:49:20 1419

原创 unity 摄像机消耗什么?

遮挡剔除(Occlusion Culling):如果场景中存在大量物体,即使这些物体不在摄像机的视野范围内,摄像机也需要对它们进行遮挡剔除处理,以减少渲染开销。综上所述,摄像机消耗的主要资源是 CPU 和 GPU,而具体消耗的大小则和场景中物体的数量和复杂度、摄像机的分辨率、帧率等因素有关。如果场景中的物体数量较多或复杂度较高,可以通过优化遮挡剔除等方式来减少摄像机的消耗。渲染:摄像机需要根据场景中的物体渲染出对应的图像。摄像机的渲染开销主要和场景中的物体数量、复杂度以及材质等因素有关。

2023-04-21 14:48:05 195

原创 协程是怎么实现的,如何用纯C#怎么实现协程,携程和线程的区别

在上面的代码中,CoroutineExample类是一个协程管理器,通过Start()方法来启动协程的执行,通过Stop()方法来停止协程的执行,通过Resume()方法来恢复协程的执行。在Resume()方法中,使用while循环来遍历协程中的yield语句,如果协程被暂停或已经执行完毕,则跳出循环。在上面的代码中,MyCoroutine()方法是一个协程,使用StartCoroutine()方法来启动协程的执行。在MyCoroutine()方法中,使用yield return语句来暂停协程的执行。

2023-04-21 14:47:56 1634

原创 Unity UI管理要怎么做?包括一些什么东西?

UI(User Interface,用户界面)管理是游戏开发中一个非常重要的部分,它主要负责游戏中各种菜单、按钮、提示框等用户交互界面的创建、布局、显示、更新和销毁。UI的数据绑定和事件处理:在UI中,通常需要将数据与UI进行绑定,比如将游戏中的玩家信息与UI中的头像、金币等显示相关联。UI的创建和管理:在游戏中,UI需要动态创建、显示和销毁,同时还需要考虑UI的布局、层级等问题。比如UI的颜色、字体、图标等需要统一,按钮的位置、大小、样式等需要符合一定的规范。

2023-04-21 14:47:55 481

原创 如果C#没有提供强制类型转换,你怎么自己去实现它?

使用Convert类:Convert类是C#中一个非常实用的类,它提供了很多转换方法,可以将一个类型转换为另一个类型。使用泛型方法:可以使用泛型方法来进行类型转换,通过传递不同的类型参数来实现不同类型之间的转换。比如,可以定义一个ConvertTo<T>()方法,将一个类型转换为指定的类型。比如,可以定义一个ToInt()方法,将一个字符串转换为整数类型。需要注意的是,自定义类型转换方法可能会出现一些错误,比如转换失败或者转换结果不正确,因此需要对输入参数进行检查和错误处理。

2023-04-21 14:47:48 148

原创 C# Select()字符串数组转为整型数组

要将字符串数组转为整型数组,可以使用C#中的LINQ(Language-Integrated Query)和。需要注意的是,如果字符串数组中有不能转为整型的字符串,将会抛出异常。方法可以将一个集合的每个元素应用一个转换方法后返回一个新的集合。将每个字符串转为对应的整型,并返回一个新的整型数组。方法将LINQ查询结果转为整型数组。方法将整型数组转为字符串,方便输出。

2023-04-21 14:46:55 1019

原创 Unity 四元数和欧拉角的关系

欧拉角和四元数之间的转换可以通过Unity中的Quaternion和Transform组件中的rotation属性来完成。可以使用Quaternion.Euler函数将欧拉角转换为四元数,也可以使用Quaternion.ToEulerAngles函数将四元数转换为欧拉角。但是需要注意的是,欧拉角存在万向锁(Gimbal Lock)的问题,即当旋转角度接近90度时,会出现某个轴失去旋转自由度的问题。而四元数则不存在万向锁的问题,因此在旋转计算时,建议使用四元数来进行计算。

2023-04-21 13:57:06 460

原创 C# 中的正则表达式,如何使用正则表达式进行字符串匹配和替换?

在 C# 中,可以使用正则表达式进行字符串匹配和替换。正则表达式是一种用来描述字符串模式的语言,可以用来检查一个字符串是否符合某种模式,或者从字符串中提取符合某种模式的子串。其构造函数接受两个参数,第一个参数是正则表达式的字符串表示,第二个参数是一个选项枚举类型,用来指定匹配模式。该方法接受两个字符串参数,第一个参数表示要进行替换的原始字符串,第二个参数表示要替换成的新字符串。方法来进行字符串匹配。该方法接受一个字符串参数,用来表示要匹配的字符串。中的数字替换成字符串 "dog",并将结果输出到控制台。

2023-04-19 17:03:57 3246

原创 C#重载(overload)和重写(overwrite)的区别。C# 中的运算符重载和类型转换,以及它们的使用场景和注意事项。

C# 中的运算符重载和类型转换是面向对象编程的重要概念,可以帮助我们简化代码实现,提高程序的可读性和可维护性。在下面,我们将介绍运算符重载和类型转换的基础知识、使用场景和注意事项。

2023-04-19 16:59:18 1236

原创 C# 中的异步编程模型(Async/Await)和并行编程模型(Parallel)。

异步编程模型(Async/Await)是用于处理异步操作的一种技术,它允许程序在执行异步操作时不会被阻塞。异步编程模型(Async/Await)是基于任务的编程模型,其中任务是一种表示异步操作的对象。Async/Await的基本思想是,将异步操作封装到一个任务(Task)中,并使用await关键字等待任务的完成,使程序可以在等待任务完成时继续执行其他操作。C# 中的异步编程模型(Async/Await)和并行编程模型(Parallel)是在处理异步操作和并行处理任务方面非常重要的概念。

2023-04-19 16:56:42 1071

原创 C# 中的设计模式,如何使用常见的设计模式实现程序功能?

设计模式不是一种具体的技术,而是一种被广泛使用的编程思想,它们提供了一种经过验证的解决方案,是解决问题的一种思路,可以帮助开发人员解决特定类型的问题。行为型模式:用于描述对象之间的通信方式,包括责任链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式和访问者模式。工厂模式是一种常见的设计模式,它的主要作用是创建对象。创建型模式:用于描述对象的创建过程,包括简单工厂模式、工厂方法模式、抽象工厂模式、单例模式、原型模式和建造者模式。

2023-04-19 16:47:14 1242

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除