做暧暖爱视频网站,天津网站建设制作设计,自动生成ui界面,开发一个网址要多少钱单例模式是一种常用的创建型设计模式#xff0c;其目的是确保一个类只有一个实例#xff0c;并提供一个全局访问点。
单例模式的原理
单例模式的核心在于控制类的实例化过程#xff0c;通常通过以下方式实现#xff1a;
私有化构造函数#xff0c;防止外部直接实例化。…单例模式是一种常用的创建型设计模式其目的是确保一个类只有一个实例并提供一个全局访问点。
单例模式的原理
单例模式的核心在于控制类的实例化过程通常通过以下方式实现
私有化构造函数防止外部直接实例化。提供一个静态方法或属性用于返回类的唯一实例。使用懒汉式或饿汉式初始化策略来创建实例。
UML 类图
下面是单例模式的UML类图
-----------------
| Singleton |
-----------------
| -instance: Singleton |
-----------------
| getInstance(): Singleton |
| doSomething(): void |
-----------------
在这个UML类图中
Singleton 类有一个私有的静态变量 instance用来存储唯一的实例。getInstance() 方法是一个静态方法用于获取 Singleton 类的唯一实例。doSomething() 是一个普通的方法用于演示单例对象的功能。
Java 代码示例
这里提供两种常见的单例模式实现方式懒汉式和饿汉式。
饿汉式线程安全加载速度较慢
public class Singleton {// 在静态初始化器中创建实例保证线程安全private static final Singleton INSTANCE new Singleton();// 私有构造函数防止外部实例化private Singleton() {}// 公共静态方法提供全局访问点public static Singleton getInstance() {return INSTANCE;}// 示例方法public void doSomething() {System.out.println(Doing something...);}
}
懒汉式线程安全延迟加载
public class Singleton {// 私有静态变量初始值为 nullprivate static Singleton instance;// 私有构造函数防止外部实例化private Singleton() {}// 公共静态方法提供全局访问点public static synchronized Singleton getInstance() {if (instance null) {instance new Singleton();}return instance;}// 示例方法public void doSomething() {System.out.println(Doing something...);}
}
懒汉式优化双重检查锁定Double-Checked Locking
为了提高性能可以使用双重检查锁定来减少同步锁的开销
public class Singleton {// 使用 volatile 关键字确保多线程环境下的可见性private static volatile Singleton instance;// 私有构造函数防止外部实例化private Singleton() {}// 公共静态方法提供全局访问点public static Singleton getInstance() {if (instance null) {synchronized (Singleton.class) {if (instance null) {instance new Singleton();}}}return instance;}// 示例方法public void doSomething() {System.out.println(Doing something...);}
}
C 实现
在 C 中我们可以使用静态成员变量和静态成员函数来实现单例模式。
#include iostreamclass Singleton {
private:// 私有构造函数防止外部实例化Singleton() {}// 删除拷贝构造函数和赋值操作符防止拷贝Singleton(const Singleton) delete;Singleton operator(const Singleton) delete;// 静态成员变量存储唯一的实例static Singleton* instance;public:// 静态成员函数提供全局访问点static Singleton* getInstance() {if (instance nullptr) {instance new Singleton();}return instance;}// 示例方法void doSomething() {std::cout Doing something... std::endl;}
};// 初始化静态成员变量
Singleton* Singleton::instance nullptr;int main() {Singleton* singleton Singleton::getInstance();singleton-doSomething();return 0;
}
Python 实现
在 Python 中可以通过模块级别的全局变量来实现单例模式也可以使用装饰器或者元类。
class Singleton:_instance Nonedef __new__(cls):if not cls._instance:cls._instance super(Singleton, cls).__new__(cls)return cls._instancedef do_something(self):print(Doing something...)# 测试
singleton1 Singleton()
singleton2 Singleton()print(singleton1 is singleton2) # 输出 True表明它们是同一个实例
singleton1.do_something()
Go 实现
在 Go 中可以使用包级变量来实现单例模式。
package mainimport fmttype Singleton struct{}var instance *Singletonfunc GetInstance() *Singleton {if instance nil {instance Singleton{}}return instance
}func (s *Singleton) DoSomething() {fmt.Println(Doing something...)
}func main() {singleton : GetInstance()singleton.DoSomething()
}
解释
C使用了静态成员变量和静态成员函数来确保单例的唯一性和全局可访问性。同时删除了拷贝构造函数和赋值操作符防止拷贝。Python使用了类的 __new__ 方法来控制实例的创建确保只有一个实例存在。Go使用了包级变量 instance 来存储唯一的实例并通过 GetInstance 函数来提供全局访问点。 总结
这些实现都遵循了单例模式的基本原则确保一个类只有一个实例并提供一个全局访问点。每种语言的实现方式有所不同但核心思想是一致的。