当前位置: 首页 > news >正文

Java小白-设计模式

一、什么是设计模式

简单点说,设计模式(Design Pattern)就是前人踩坑总结出来的、能反复用的、解决常见软件设计问题的套路。它就是一套被验证过很多次的“万能方案”,有了它你写程序就不会瞎写,而是用一套聪明的、优雅的思路去组织代码,让程序更好写、更好维护、更容易扩展。

二、为啥要学设计模式?

因为做项目的时候,总是会碰到这些场景:有些对象只想要一个(单例 Singleton);有时想根据需求创建不同的对象(工厂 Factory);有两个模块接口对不上,需要接个“转接头”(适配器 Adapter);有时候需要让别人替你干活,还要做点额外事(代理 Proxy

三、设计模式大致分几类?

分类中文名英文名一句话定位
创建型(5 种)单例Singleton全局只有一个实例
简单工厂*Simple Factory*用一个工厂方法生产对象
工厂方法Factory Method让子类决定创建哪个具体实例
抽象工厂Abstract Factory创建“一族”相互依赖的对象
建造者Builder按步骤组装复杂对象
原型Prototype通过克隆而不是 new 来创建
结构型(7 种)适配器Adapter把旧接口转换成客户端期望的新接口
桥接Bridge抽象与实现分离,两者可独立变化
组合Composite把对象组合成树形结构表示“整体-部分”
装饰Decorator动态地给对象加功能,比继承灵活
外观Facade对外统一高层接口,隐藏子系统复杂度
享元Flyweight共享细粒度对象,节省内存
代理Proxy用一个占位对象控制对真实对象的访问
行为型(11 种)责任链Chain of Responsibility请求沿链传递,直到被处理
命令Command把请求封装成对象,实现参数化与撤销
解释器Interpreter定义语言的文法并解释执行
迭代器Iterator顺序访问聚合元素,不暴露其内部结构
中介者Mediator对象间不直接通信,统一由中介转发
备忘录Memento保存对象状态,可恢复
观察者Observer一对多状态变化通知
状态State状态改变时行为跟着改变
策略Strategy封装算法族,可动态互换
模板方法Template Method算法骨架固定,把步骤延迟到子类
访问者Visitor不改变类结构即可扩展其操作

单例模式(Singleton Pattern)

单例模式的核心思想:自己管自己,全局唯一。保证一个类在整个程序中只有一个实例,并且提供一个全局访问点。

系统中只能有一个对象的时候使用,比如:线程池、配置管理器、日志对象、数据库连接池。

public class Singleton {private static volatile Singleton instance; // 加 volatile 保证可见性和防止指令重排private Singleton() {} // 私有构造public static Singleton getInstance() {if (instance == null) {synchronized (Singleton.class) {if (instance == null) {  // 双重检查instance = new Singleton();}}}return instance;}
}

工厂模式(Factory Pattern)

把对象的创建过程封装起来,把“new”操作交给工厂,客户端只需要告诉工程需要什么就行。

用处:当需要创建复杂对象时,不想把 new 散落到各处,想统一管理;创建对象的过程可能变化,但对外接口不变。

例子:简单工厂模式(一个工厂生产多种产品)

// 产品接口
interface Product {void show();
}// 具体产品A
class ProductA implements Product {public void show() {System.out.println("生产了产品A");}
}// 具体产品B
class ProductB implements Product {public void show() {System.out.println("生产了产品B");}
}// 工厂类
class SimpleFactory {public static Product createProduct(String type) {if ("A".equals(type)) {return new ProductA();} else if ("B".equals(type)) {return new ProductB();}throw new IllegalArgumentException("没有这个产品");}
}// 客户端
public class FactoryTest {public static void main(String[] args) {Product p1 = SimpleFactory.createProduct("A");p1.show();Product p2 = SimpleFactory.createProduct("B");p2.show();}
}

适配器模式(Adapter Pattern)

它把一个类的接口转换成客户希望的另一个接口,相当于“转接头”,使原本接口不兼容的两个类可以协同工作。

用处:老代码和新代码对不上;第三方库接口和自己接口对不上;不想改老代码,只想中间做个适配。

例子:手机充电头适配器

// 目标接口(客户期望的接口)
interface Target {void request();
}// 已有功能(不兼容的接口)
class Adaptee {public void specificRequest() {System.out.println("充电:220V 交流电");}
}// 适配器
class Adapter implements Target {private Adaptee adaptee;public Adapter(Adaptee adaptee) {this.adaptee = adaptee;}public void request() {System.out.println("使用适配器...");adaptee.specificRequest();}
}// 客户端
public class AdapterTest {public static void main(String[] args) {Adaptee adaptee = new Adaptee();Target target = new Adapter(adaptee);target.request();}
}

代理模式(Proxy Pattern)

它为其他对象提供一种访问控制,代理对象在目标对象之前起到中介作用,可以在前后做一些额外操作(权限控制、延迟加载、记录日志等)。

用处:需要对目标对象做控制(加权限、加缓存);不想或者不能修改目标对象代码;远程代理(RMI)、虚拟代理(延迟加载)、安全代理(权限控制)等场景。

例子:静态代理

// 接口
interface Service {void operation();
}// 真实对象
class RealService implements Service {public void operation() {System.out.println("执行真实操作...");}
}// 代理对象
class ProxyService implements Service {private RealService realService;public ProxyService(RealService realService) {this.realService = realService;}public void operation() {System.out.println("开始代理,做一些额外操作...");realService.operation();System.out.println("代理结束...");}
}// 客户端
public class ProxyTest {public static void main(String[] args) {RealService realService = new RealService();ProxyService proxy = new ProxyService(realService);proxy.operation();}
}

这些模式就是最适合Java 学生先掌握的核心四个,理解了这几个,剩下的其他设计模式学起来也是举一反三。

http://www.dtcms.com/a/276835.html

相关文章:

  • 动态规划理论基础,LeetCode 509. 斐波那契数
  • 012_PDF处理与文档分析
  • jenkins使用Jenkinsfile部署springboot+docker项目
  • 011_视觉能力与图像处理
  • Docker 搭建本地Harbor私有镜像仓库
  • Rerank模型
  • 【Linux学习笔记】认识信号和信号的产生
  • C++随笔
  • iOS高级开发工程师面试——关于优化
  • Datawhale 2025 AI夏令营 MCP Server Task2
  • 一文认识并学会c++模板(初阶)
  • 基于无人机 RTK 和 yolov8 的目标定位算法
  • ESP32使用freertos更新lvgl控件内容
  • 【时间之外】尘封的智能套件复活记
  • 数据结构与算法之美:跳表
  • 【CMake】CMake构建项目入门
  • 数据标注:AI时代的黄金矿场如何规避法律暗礁
  • C语言习题三
  • HCIA--- OSPF动态路由实验
  • 基于springboot+Vue的二手物品交易的设计与实现(免费分享)
  • 《棒垒球知识科普》技巧赛规则·棒球1号位
  • houdini 用 vellum 制作一个最简单的布料
  • Windows环境下JS计时器精度差异揭秘
  • PyQt5布局管理:QHBoxLayout和QVBoxLayout详解
  • cmd命令之for循环
  • 深入理解-ConcurrentHashMap:JDK-1-7-与-1-8-的演进与实现原理
  • 管理端口: 一个简单的锤子架子
  • JavaSE常用类
  • 《Spring 中上下文传递的那些事儿》Part 11:上下文传递最佳实践总结与架构演进方向
  • Linux反弹shell的几种方式