【设计模式】单例模式

简介: 【设计模式】单例模式

前提

使用单例模式需有一下三点:

  • 要有一个自己的私有类型的变量
  • 要有一个私有的构造函数
  • 全局访问点(static)

一、什么是单例模式

保证一个类仅有一个实例,并提供一个访问它的全局访问点。UML如下:

其中,Singleton类,定义了一个GetInstance操作,允许客户访问它的唯一实例,GetInstance是一个静态方法,主要负责创建自己的唯一实例

1、Singleton类

1. class Singleton
2.     {
3. private static Singleton instance;
4. 
5. //构造方法让其private,这就堵死了外界利用new创建此类型实例的可能
6. private Singleton() { }
7. public static Singleton GetInstance() //此方法是获得本类实例的唯一全局访问点
8.         {
9. if (instance==null) //如果实例不存在,则new一个新实例,否则返回已有的实例
10.             {
11.                 instance = new Singleton();
12.             }
13. return instance;
14.         }
15.     }

2、客户端

1. static void Main(string[]args)
2.         {
3.             Singleton s1 = Singleton.GetInstance();
4.             Singleton s2 = Singleton.GetInstance();
5. 
6. //比较两次实例化后对象的结果是实例相同
7. if (s1==s2)
8.             {
9.                 Console.WriteLine("两个对象是相同的实例");
10.             }
11.             Console.Read();
12.         }

运行上述程序,程序台输出了“两个对象是相同的实例”,这说明Singleton1和Singleton2是相同的实例,也即一个类仅有一个实例。

二、单例模式的应用

1、什么时候使用单例模式

想要控制实例数目,节省系统资源的时候

2、优点

  • 内存中只有一个实例,减少了内存开支
  • 避免了对资源的多重占用

3、缺点

  • 没有抽象层,扩展困难
  • 与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化

4、使用场景

根据业务的需要来决定用不用单例模式

5、注意

  • 单例类只能有一个实例
  • 单例类必须自己创建自己的唯一实例
  • 单例类必须给所有其他对象提供这一实例

 


相关文章
|
7天前
|
设计模式 存储 SQL
PHP中的设计模式:单例模式的探索
在PHP开发中,单例模式是一种常用的设计模式,它确保一个类只有一个实例,并提供一个全局访问点。本文将通过一个简单的例子,逐步引导你理解如何在PHP中实现和利用单例模式,以及它在实际项目中的应用价值。
|
2月前
|
设计模式 缓存 安全
Java设计模式的单例模式应用场景
Java设计模式的单例模式应用场景
32 4
|
2月前
|
设计模式 SQL 安全
【设计模式】第二篇:单例模式的几种实现And反射对其的破坏
一个普通实例化,一个反射实例化 但是我们如果通过反射的方式进行实例化类,会有什么问题呢? public static void main(String[] args) throws Exception { Lazy1 lazy1 = getLazy1();
27 5
|
14天前
|
设计模式 安全 程序员
C#设计模式之单例模式
C#设计模式之单例模式
29 3
|
8天前
|
设计模式 存储 数据库连接
Python设计模式:巧用元类创建单例模式!
Python设计模式:巧用元类创建单例模式!
17 0
|
12天前
|
设计模式 安全 测试技术
[设计模式]创建型模式-单例模式
[设计模式]创建型模式-单例模式
|
1月前
|
设计模式 安全 C++
C++一分钟之-C++中的设计模式:单例模式
【7月更文挑战第13天】单例模式确保类只有一个实例,提供全局访问。C++中的实现涉及线程安全和生命周期管理。基础实现使用静态成员,但在多线程环境下可能导致多个实例。为解决此问题,采用双重检查锁定和`std::mutex`保证安全。使用`std::unique_ptr`管理生命周期,防止析构异常和内存泄漏。理解和正确应用单例模式能提升软件的效率与可维护性。
26 2
|
1月前
|
设计模式 安全 Java
Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
54 1
|
1月前
|
设计模式 安全 Java
技术成神之路:设计模式(一)单例模式
【7月更文挑战第3天】技术成神之路:设计模式(一)单例模式
27 1
|
2月前
|
设计模式 安全 Java
Java中的单例模式是一种设计模式,它保证一个类只有一个实例,并提供一个全局访问点
Java单例模式确保类仅有一个实例,并提供全局访问点。常见实现包括: - 饿汉式:静态初始化,线程安全。 - 懒汉式:延迟初始化,需同步保证线程安全。 - 双重检查锁定:优化懒汉式,减少同步开销。 - 静态内部类:延迟加载,线程安全。 - 枚举:简洁线程安全,不适用于复杂构造。 - 容器实现:如Spring框架,用于依赖注入。选择依据需求,如延迟加载、线程安全和扩展性。
49 10