Java常用设计模式

server/2025/3/18 12:59:05/

        设计模式是软件开发中解决常见问题的模板或指南。Java中的23种设计模式通常被分为三大类:创建型模式(Creational Patterns)结构型模式(Structural Patterns)行为型模式(Behavioral Patterns)


创建型模式

1.单例模式(Singleton Pattern)

确保一个类仅有一个实例,并提供一个全局访问点。它有助于控制共享资源的访问。

java">public class Singleton {private static Singleton instance;private Singleton() {// 私有构造函数,防止外部实例化}public static Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}public void showMessage() {System.out.println("Hello, I am a Singleton!");}
}// 使用示例
public class SingletonDemo {public static void main(String[] args) {Singleton singleton = Singleton.getInstance();singleton.showMessage();}
}
2.工厂方法模式(Factory Method Pattern)

定义一个用于创建对象的接口,但是让子类决定将哪一个类实例化。这种模式使得一个类的实例化延迟到其子类。

java">interface Product {void use();
}class ConcreteProductA implements Product {@Overridepublic void use() {System.out.println("Using Product A");}
}class ConcreteProductB implements Product {@Overridepublic void use() {System.out.println("Using Product B");}
}abstract class Creator {public abstract Product factoryMethod();public void anOperation() {Product product = factoryMethod();product.use();}
}class ConcreteCreatorA extends Creator {@Overridepublic Product factoryMethod() {return new ConcreteProductA();}
}class ConcreteCreatorB extends Creator {@Overridepublic Product factoryMethod() {return new ConcreteProductB();}
}// 使用示例
public class FactoryMethodDemo {public static void main(String[] args) {Creator creatorA = new ConcreteCreatorA();creatorA.anOperation();Creator creatorB = new ConcreteCreatorB();creatorB.anOperation();}
}
3.抽象工厂模式(Abstract Factory Pattern)

提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。

java">interface AbstractFactory {ProductA createProductA();ProductB createProductB();
}class ConcreteFactory1 implements AbstractFactory {@Overridepublic ProductA createProductA() {return new ConcreteProductA1();}@Overridepublic ProductB createProductB() {return new ConcreteProductB1();}
}class ConcreteFactory2 implements AbstractFactory {@Overridepublic ProductA createProductA() {return new ConcreteProductA2();}@Overridepublic ProductB createProductB() {return new ConcreteProductB2();}
}interface ProductA {void use();
}interface ProductB {void use();
}class ConcreteProductA1 implements ProductA {@Overridepublic void use() {System.out.println("Using Product A1");}
}class ConcreteProductA2 implements ProductA {@Overridepublic void use() {System.out.println("Using Product A2");}
}class ConcreteProductB1 implements ProductB {@Overridepublic void use() {System.out.println("Using Product B1");}
}class ConcreteProductB2 implements ProductB {@Overridepublic void use() {System.out.println("Using Product B2");}
}// 使用示例
public class AbstractFactoryDemo {public static void main(String[] args) {AbstractFactory factory1 = new ConcreteFactory1();ProductA productA1 = factory1.createProductA();ProductB productB1 = factory1.createProductB();productA1.use();productB1.use();AbstractFactory factory2 = new ConcreteFactory2();ProductA productA2 = factory2.createProductA();ProductB productB2 = factory2.createProductB();productA2.use();productB2.use();}
}

区别

  • 工厂方法:一个子类创建一个产品,子类决定实例化单一产品。
  • 抽象工厂:一个子类创建多个相关产品,子类实例化一组相关产品。
4.建造者模式(Builder Pattern)

建造者模式是一种创建型设计模式,它允许逐步构建复杂对象。此模式主要用于当你需要构造一个复杂对象,并希望构造过程是独立于构成该对象的部分及其装配方式时。

java">class Product {private String partA;private String partB;public void setPartA(String partA) {this.partA = partA;}public void setPartB(String partB) {this.partB = partB;}
}interface Builder {void buildPartA();void buildPartB();Product getResult();
}class ConcreteBuilder implements Builder {private Product product = new Product();public void buildPartA() {product.setPartA("PartA");}public void buildPartB() {product.setPartB("PartB");}public Product getResult() {return product;}
}// 调用
Builder builder = new ConcreteBuilder();
builder.buildPartA();
builder.buildPartB();
Product product = builder.getResult();


结构型模式

1.适配器模式(Adapter Pattern)

允许将不兼容的接口转换成兼容的形式,使得原本由于接口不匹配而不能一起工作的类可以协同工作。

java">interface Target {void request();
}class Adaptee {public void specificRequest() {System.out.println("Adaptee's specific request");}
}class Adapter implements Target {private Adaptee adaptee;public Adapter(Adaptee adaptee) {this.adaptee = adaptee;}@Overridepublic void request() {adaptee.specificRequest();}
}// 使用示例
public class AdapterDemo {public static void main(String[] args) {Adaptee adaptee = new Adaptee();Target target = new Adapter(adaptee);target.request();}
}
2.装饰者模式(Decorator Pattern)

动态地给一个对象添加一些额外的职责。就功能来说,它相比生成子类更为灵活。

java">interface Component {void operation();
}class ConcreteComponent implements Component {@Overridepublic void operation() {System.out.println("ConcreteComponent operation");}
}abstract class Decorator implements Component {protected Component component;public Decorator(Component component) {this.component = component;}@Overridepublic void operation() {component.operation();}
}class ConcreteDecoratorA extends Decorator {public ConcreteDecoratorA(Component component) {super(component);}@Overridepublic void operation() {super.operation();System.out.println("ConcreteDecoratorA operation");}
}class ConcreteDecoratorB extends Decorator {public ConcreteDecoratorB(Component component) {super(component);}@Overridepublic void operation() {super.operation();System.out.println("ConcreteDecoratorB operation");}
}// 使用示例
public class DecoratorDemo {public static void main(String[] args) {Component component = new ConcreteComponent();Component decoratedComponentA = new ConcreteDecoratorA(component);Component decoratedComponentB = new ConcreteDecoratorB(decoratedComponentA);decoratedComponentB.operation();}
}
3.代理模式(Proxy Pattern)

为其他对象提供一种代理以控制对这个对象的访问。使用代理模式可以进行权限控制、访问远程服务器等操作。

java">interface Subject {void request();
}class RealSubject implements Subject {@Overridepublic void request() {System.out.println("RealSubject request");}
}class Proxy implements Subject {private RealSubject realSubject;@Overridepublic void request() {if (realSubject == null) {realSubject = new RealSubject();}realSubject.request();}
}// 使用示例
public class ProxyDemo {public static void main(String[] args) {Proxy proxy = new Proxy();proxy.request();}
}

行为型模式

1.观察者模式(Observer Pattern)

定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。

java">import java.util.ArrayList;
import java.util.List;interface Observer {void update(String message);
}class ConcreteObserver implements Observer {private String name;public ConcreteObserver(String name) {this.name = name;}@Overridepublic void update(String message) {System.out.println(name + " received message: " + message);}
}class Subject {private List<Observer> observers = new ArrayList<>();public void attach(Observer observer) {observers.add(observer);}public void detach(Observer observer) {observers.remove(observer);}public void notifyObservers(String message) {for (Observer observer : observers) {observer.update(message);}}
}// 使用示例
public class ObserverDemo {public static void main(String[] args) {Subject subject = new Subject();Observer observer1 = new ConcreteObserver("Observer 1");Observer observer2 = new ConcreteObserver("Observer 2");subject.attach(observer1);subject.attach(observer2);subject.notifyObservers("Hello Observers!");}
}
2.策略模式(Strategy Pattern)

定义一系列算法,把它们一个个封装起来,并且使它们可以互相替换。本模式使得算法可以独立于使用它的客户而变化。

java">interface Strategy {void execute();
}class ConcreteStrategyA implements Strategy {@Overridepublic void execute() {System.out.println("Executing Strategy A");}
}class ConcreteStrategyB implements Strategy {@Overridepublic void execute() {System.out.println("Executing Strategy B");}
}class Context {private Strategy strategy;public Context(Strategy strategy) {this.strategy = strategy;}public void executeStrategy() {strategy.execute();}
}// 使用示例
public class StrategyDemo {public static void main(String[] args) {Context context = new Context(new ConcreteStrategyA());context.executeStrategy();context = new Context(new ConcreteStrategyB());context.executeStrategy();}
}
3.命令模式(Command Pattern)

将请求封装成对象,从而使您可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。

java">interface Command {void execute();
}class Light {public void on() {System.out.println("Light is on");}public void off() {System.out.println("Light is off");}
}class LightOnCommand implements Command {private Light light;public LightOnCommand(Light light) {this.light = light;}@Overridepublic void execute() {light.on();}
}class LightOffCommand implements Command {private Light light;public LightOffCommand(Light light) {this.light = light;}@Overridepublic void execute() {light.off();}
}class RemoteControl {private Command command;public void setCommand(Command command) {this.command = command;}public void pressButton() {command.execute();}
}// 使用示例
public class CommandDemo {public static void main(String[] args) {Light light = new Light();Command lightOn = new LightOnCommand(light);Command lightOff = new LightOffCommand(light);RemoteControl remote = new RemoteControl();remote.setCommand(lightOn);remote.pressButton();remote.setCommand(lightOff);remote.pressButton();}
}


http://www.ppmy.cn/server/175961.html

相关文章

python脚本实现服务器内存和cpu使用监控,并记录日志,可以设置阈值和采样频率

Python 脚本&#xff0c;实现以下功能&#xff1a; 按日期自动生成日志文件&#xff08;例如 cpu_mem_20231001.csv&#xff09;当 CPU 或内存超过阈值时触发记录独立记录报警事件&#xff08;保存到 alert.log&#xff09;支持自定义阈值和监控间隔 脚本代码 import psutil …

HCIA-PPP

一、基本概念 1、定义&#xff1a;PPP 协议是一种数据链路层协议&#xff0c;在两点之间建立直接通信连接。常用于拨号上网、宽带接入、路由器间通信等。 2、核心功能&#xff1a; ①链路控制&#xff1a;建立、配置和测试数据链路连接。 ②网络层协议支持&#xff1a;支持…

【密码学——基础理论与应用】李子臣编著 第四章 SM4分组密码算法 课后习题

免责声明 这里都是自己搓或者手写的。 里面不少题目感觉有问题或者我的理解有偏颇&#xff0c;请大佬批评指正&#xff01; 不带思考抄作业的请自动退出&#xff0c;我的并非全对&#xff0c;仅仅提供思维&#xff01; SM4的python实现 基于AI生成的SM4加密算法-CSDN博客 题…

【云原生技术】容器技术的发展史

一、Jail 时代 容器不是一个新概念或者新技术&#xff0c;很早就有了&#xff0c;只是近几年遇到了云计算&#xff0c;整个技术 被彻底引爆了。 1.1 1979年 贝尔实验室发明 chroot chroot系统调用是在 1979 年开发第 7 版 Unix 期间引入的。贝尔实验室在 Unix V7 的 开发过程…

【STM32】USART串口协议串口外设-学习笔记

串口协议 通信接口 通信的目的&#xff1a;将一个设备的数据传送到另一个设备&#xff0c;扩展硬件系统。比如STM32芯片内部集成了很多功能模块&#xff0c;像定时器计数、PWM输出、AD采集等等。这些都是芯片内部的电路&#xff0c;这些电路的配置寄存器&#xff0c;数据寄存…

C++ 类和对象----构造函数

一、构造函数 概念&#xff1a; 在平时初始化&#xff0c;都要调用Init公有方法来初始化&#xff0c;调用比较频繁&#xff0c;因此&#xff0c;构造函数就是在对象创建时&#xff0c;就将信息设置进去。 没有构造函数前&#xff1a; #include<iostream> using namesp…

【蓝桥杯速成】| 5.动态规划

学习资料 代码随想录 动态规划五部曲 确定dp数组&#xff08;dp table&#xff09;以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组 简单题 509. 斐波那契数 - 力扣&#xff08;LeetCode&#xff09; 70. 爬楼梯 - 力扣&#xff08;LeetCode&#…

网络层协议

目录 一、网段划分的发展过程 &#xff08;1&#xff09;固定长度的网络号 &#xff08;2&#xff09;子网掩码---网络号长度不再固定 二、公有IP和私有IP &#xff08;1&#xff09;私有IP &#xff08;2&#xff09;NAT技术 三、IP协议报头 分片操作 四、查看一下li…