java访问修饰符是支撑封装类设计模式的关键基础设施,通过private+public接口隔离实现、package-private限定模块内协作、protected支持可控继承扩展,并需结合工厂或代理彻底解耦创建与实现。

Java 中访问修饰符本身不直接实现设计模式,但它们是支撑设计模式(尤其是封装类模式)隐藏实现细节的关键基础设施。真正“隐藏实现”的不是修饰符本身,而是通过修饰符约束访问权限,配合接口、抽象类、工厂、代理等模式结构,让调用方只能看到契约,无法依赖具体实现。
用 private + public 接口隔离内部实现
这是最基础也最关键的组合。把字段和辅助方法设为 private,只暴露 public 的接口方法——这本身就是封装原则的落地,也是多数设计模式的前提。
例如在策略模式中:
- 策略接口(public interface PaymentStrategy)定义统一行为;
- 具体策略类(如 AlipayStrategy、WechatStrategy)内部字段(如密钥、会话 ID)全部 private;
- 客户端只通过接口变量调用 pay(amount),完全不知晓各策略如何签名、加解密或调用哪条 HTTP 路径。
用 package-private(默认)限定模块内协作
当一组类共同构成一个内聚模块(比如一个“订单履约子系统”),可将非对外暴露的协作类、工具类、中间状态类设为 package-private(不写任何修饰符)。它们对包外不可见,但包内类可自由使用——这相当于划出一块“可信边界”,既支持内部灵活实现,又防止外部误用。
例如在模板方法模式中:
- OrderProcessor(public abstract class)定义 execute() 模板;
- validate()、reserveInventory() 等钩子方法设为 protected,供子类重写;
- 而包内的 InventoryLockService 或 IdempotencyChecker 只声明为默认访问级别——其他模块无法 new 它们,也无法感知其存在,只通过 OrderProcessor 的公开流程间接使用。
用 protected 支持安全的继承扩展
protected 不是为“开放访问”,而是为“可控扩展”。它允许子类复用父类能力,同时阻止无关类直接调用——这是模板方法、观察者(监听器注册)、建造者等模式能安全演进的基础。
例如在建造者模式中:
- MealBuilder(public abstract class)提供 protected void addSide(String side);
- 子类 BurgerMealBuilder 可调用该方法组装套餐,但外部代码不能直接调用它去随意修改任意 MealBuilder 实例;
- 最终构建动作仍由 public Meal build() 统一出口控制,确保对象状态合法。
结合工厂/代理进一步切断创建与实现的耦合
即使类本身用了 private 字段,若客户端还能 new XxxImpl(),那封装就形同虚设。这时需配合工厂或代理:
- 把具体类设为 package-private 或 public class 但构造器 private,仅通过 public static Xxx getInstance() 提供实例;
- 用 java.lang.reflect.Proxy 或 CGLIB 动态生成接口代理,真实实现类完全不暴露(如 Spring AOP);
- 客户端拿到的永远是接口引用,JVM 运行时才绑定到某个具体类——连类名都看不到,自然无法依赖其实现细节。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











