🌈 个人主页:danci_
🔥 系列专栏:《设计模式》
💪🏻 制定明确可量化的目标,坚持默默的做事。
设计模式深度解析:单例模式与原型模式的深度探索之旅
文章目录
一、定义🌐

单例模式:独一无二的存在 🤔
| ✨ 通过确保类的唯一实例存在和全局可访问性,实现资源的有效管理和全局状态的统一控制。 |
作用
| 在软件设计中,单例模式通过将构造函数私有化、创建静态私有变量以及提供公共的静态方法来获取实例等方式,确保了类的唯一实例的创建和访问。这种方式可以有效地节省系统资源,避免因为创建多个实例而导致的资源浪费和性能下降。 |
如何封装对象的创建过程
单例模式是一种巧妙的设计,它通过封装对象的创建过程,确保一个类在应用中只有一个实例,并提供一个全局访问点来获取这个实例。下面是对单例模式如何封装对象创建过程的详细描述:👇
1. 隐藏构造函数:
单例模式将类的构造函数私有化(设为私有或者受保护的),这样外部代码就无法直接通过new关键字来创建类的实例。通过隐藏构造函数,单例模式限制了外部对类实例化的权限,从而确保整个应用中只能通过特定的途径来获取类的实例。
2. 提供静态访问方法:
单例模式提供了一个静态的访问方法(通常是getInstance()方法),用于获取类的唯一实例。这个方法首先检查类的实例是否已经存在,如果存在则直接返回这个实例;如果不存在,则通过私有构造函数创建一个新的实例,并将其保存在一个静态的私有变量中,然后再返回这个实例。
3. 确保线程安全:
在多线程环境下,如果不采取适当的同步措施,可能会出现多个线程同时创建实例的情况,从而破坏单例的唯一性。因此,单例模式通常会通过双重检查锁定(double-checked locking)或其他线程安全机制来确保getInstance()方法的线程安全。
4. 延迟实例化:
有些单例模式的实现采用了延迟实例化的策略,即getInstance()方法第一次被调用时才创建类的实例。这种策略的好处是可以节省系统资源,因为只有当类的实例真正被需要时才会被创建。
通过封装对象的创建过程,单例模式提供了一种机制,使得开发者能够控制对象的创建和访问,从而实现了资源的有效管理和代码的简洁性。单例模式常用于那些只需要一个实例的类,如配置管理类、日志记录类、线程池类等。
原型模式:复制的艺术 😉
| ✨ 利用复制机制来简化对象的创建过程,提高开发效率,并保证新对象的正确性和一致性。 |
作用
| 减少重复劳动和资源浪费。它允许开发者直接复用已有对象的状态和行为,从而避免不必要的重复初始化操作。同时,通过复制现有对象,原型模式可以生成复杂对象的精确副本,保证了新对象与原型对象在功能和行为上的一致性。 |
如何封装对象的创建过程
通过定义一个原型接口,并允许子类实现接口的克隆方法。这个过程确保了当我们需要创建新对象时,不必通过传统的构造器,而是直接利用已有的原型对象进行复制。
具体来说,原型模式封装对象创建过程的方式如下:👇
1. 定义原型接口:
✨ 这个接口声明了一个克隆自身的方法,通常是 clone()。所有具体原型类都将实现这个接口,并提供具体的克隆方法实现。
2. 实现克隆方法:
✨ 每个具体的原型类都需要实现 clone() 方法,该方法负责创建并返回原型对象的一个副本。这个副本通常是通过深拷贝(deep copy)得到的,以确保新对象与原对象在内存上是完全独立的,修改新对象不会影响到原对象。
3. 通过复制原型来创建新对象:
✨ 当需要创建新对象时,客户端代码不再通过调用构造器,而是直接获取一个原型对象,并调用其 clone() 方法来得到一个新的对象。由于这个过程是封装在原型对象内部的,客户端代码不需要关心对象是如何被创建的,只需关注如何使用复制得到的新对象。
4. 提供全局访问点:
✨ 通常会有一个工厂方法或类似机制来充当全局访问点,负责创建并返回原型对象的实例。这样,客户端代码就可以通过这个访问点来获取原型对象,并进行复制操作。
通过这种方式,原型模式将对象的创建过程封装在原型对象内部,对外提供了统一的接口来创建新对象。这使得对象的创建过程更加灵活和可控制,同时减少了客户端代码与具体对象创建逻辑的耦合度。
原型模式在需要频繁创建相似对象或对象创建过程比较复杂的情况下非常有用。例如,在需要大量相似但又不完全相同对象的游戏开发中,可以使用原型模式来快速生成游戏中的角色或道具。


1万+

被折叠的 条评论
为什么被折叠?



