---
title: "单例和静态类"
date: "2026-03"
category: "设计模式与架构"
tags: ["设计模式与架构"]
description: "目前来看静态构造函数就是比较好的办法了，单例和基类的操作目前有点用不太到，毕竟也没什么共享的变动数据，基类的话，只有一个服务，强行去写反而有点过度设计。综合来看，下周的优化方向就是静态构造函数的方式..."
source: "https://enriquemark.com/zh-hans/posts/%E5%8D%95%E4%BE%8B%E5%92%8C%E9%9D%99%E6%80%81%E7%B1%BB"
---

目前来看静态构造函数就是比较好的办法了，单例和基类的操作目前有点用不太到，毕竟也没什么共享的变动数据，基类的话，只有一个服务，强行去写反而有点过度设计。综合来看，下周的优化方向就是静态构造函数的方式。不过写基类以后有机会可以试试看，往里面放那些会复用的方法或者属性，让多次使用的时候子类直接继承就可以免去重写。但前提是真的有复用，不然就是过度设计了。

单例和静态类最大的区别就是，前者仍然是一个类，封装、继承、多态的特性都在；但后者就真是纯粹的方法了，只是上面套了个class的皮。静态本身就意味着从定义开始就不可变动，其内容必须是固定的，那就别说什么继承和更改这种。  
关于封装这里，看上去包在类里像是有封装，但本质上里面的静态变量是整个程序的全局变量。而类就不一样了，类的实例单独处理自身作用域内的变量，而每次new出来的都是初始化内容。当然单例就比较特殊，这算是恰巧差不多了，但拿来处理当下的情况正合适。

静态最大的问题就是有静态依赖：如果一个地方用了静态，那就相当于构建了一个隐藏的全局依赖——只要一改，牵一发动全身。这就是为啥静态的最佳使用场景是字面意义上的「静态」时刻，比如单个使用的工具方法，或者是真的需要全局维持一致的静态变量。一旦动态对象依赖了静态对象，那这就会成为一个瓶颈，也会成为耦合的来源。比如十个动态对象都依赖于这个静态时，静态一动就全完——如果有个变量是可变的状态，那就不要用静态。除

非是只读的，或者说是希望不实例化就直接调用的工具方法（而且也得无状态，否则如果这个函数也以来一个可变静态，那就还是带上了静态依赖）。滥用静态的问题会很严重，使用之前一定要考虑副作用。比如DI，在没必要用静态的地方就可以不用，否则把静态变量当DI的做法完全是坏味道。DI本来就是为了去耦合，结果又上个注入的静态对象给耦合上了，这是搞毛线。
