当前位置:首页>java>java设计模式代码示例

java设计模式代码示例

  • 2026-08-25 18:58:13
java设计模式代码示例

1. 单例模式(Singleton Pattern)

核心思想:确保一个类在整个应用中只有一个实例,并提供全局唯一的访问入口。

常用实现方式

方式 1:饿汉式(线程安全,饿加载)

加载类时就初始化实例,优点是简单、线程安全;缺点是可能造成资源浪费(即使没用到也会初始化)。

java运行/** * 饿汉式单例模式 */public class HungrySingleton {    // 1. 私有静态常量:类加载时就初始化唯一实例    private static final HungrySingleton INSTANCE = new HungrySingleton();    // 2. 私有构造方法:禁止外部通过new创建实例    privateHungrySingleton() {}    // 3. 公共静态方法:提供全局访问入口    publicstatic HungrySingleton getInstance() {        return INSTANCE;    }    // 测试方法    publicvoidsayHello() {        System.out.println("饿汉式单例:Hello Singleton!");    }    // 测试    publicstaticvoidmain(String[] args) {        HungrySingleton instance1 = HungrySingleton.getInstance();        HungrySingleton instance2 = HungrySingleton.getInstance();        // 输出true,证明是同一个实例        System.out.println(instance1 == instance2);        instance1.sayHello();    }}

方式 2:懒汉式(双重检查锁,线程安全 + 懒加载)

只有首次调用getInstance()时才初始化实例,兼顾性能和线程安全,是工业级常用写法。

java运行/** * 懒汉式单例(双重检查锁) */public class LazySingleton {    // 1. 私有静态变量:volatile防止指令重排,保证实例初始化完成后再被访问    private static volatile LazySingleton INSTANCE;    // 2. 私有构造方法    privateLazySingleton() {}    // 3. 公共静态方法:双重检查锁实现懒加载+线程安全    publicstatic LazySingleton getInstance() {        // 第一层检查:避免每次调用都加锁(提升性能)        if (INSTANCE == null) {            // 加锁:保证多线程下只有一个线程能进入初始化逻辑            synchronized (LazySingleton.class) {                // 第二层检查:防止多个线程等待锁后重复初始化                if (INSTANCE == null) {                    INSTANCE = new LazySingleton();                }            }        }        return INSTANCE;    }    // 测试方法    publicvoidsayHello() {        System.out.println("懒汉式单例:Hello Lazy Singleton!");    }    // 测试    publicstaticvoidmain(String[] args) {        LazySingleton instance1 = LazySingleton.getInstance();        LazySingleton instance2 = LazySingleton.getInstance();        System.out.println(instance1 == instance2); // true        instance1.sayHello();    }}

2. 简单工厂模式(Simple Factory Pattern)

核心思想:定义一个工厂类,根据传入的参数创建不同类型的产品实例,将对象创建逻辑与业务逻辑解耦。

java运行// 步骤1:定义产品接口public interface Shape {    void draw();}// 步骤2:实现具体产品类// 圆形public class Circle implements Shape {    @Override    public void draw() {        System.out.println("绘制圆形");    }}// 矩形public class Rectangle implements Shape {    @Override    public void draw() {        System.out.println("绘制矩形");    }}// 步骤3:定义工厂类(核心)public class ShapeFactory {    // 根据参数创建不同的Shape实例    public static Shape createShape(String shapeType) {        if (shapeType == null) {            return null;        }        switch (shapeType.toLowerCase()) {            case "circle":                return new Circle();            case "rectangle":                return new Rectangle();            default:                throw new IllegalArgumentException("不支持的图形类型:" + shapeType);        }    }}// 测试类public class FactoryTest {    public static void main(String[] args) {        // 客户端只需要调用工厂方法,无需关心对象创建细节        Shape circle = ShapeFactory.createShape("circle");        circle.draw(); // 输出:绘制圆形        Shape rectangle = ShapeFactory.createShape("rectangle");        rectangle.draw(); // 输出:绘制矩形    }}

3. 策略模式(Strategy Pattern)

核心思想:定义一系列算法,将每个算法封装成独立的策略类,使它们可以互相替换,算法变化不影响使用算法的客户端。

java运行// 步骤1:定义策略接口(算法抽象)public interface PaymentStrategy {    void pay(double amount);}// 步骤2:实现具体策略类(不同算法)// 支付宝支付public class AlipayStrategy implements PaymentStrategy {    @Override    public void pay(double amount) {        System.out.println("使用支付宝支付:" + amount + "元");    }}// 微信支付public class WechatPayStrategy implements PaymentStrategy {    @Override    public void pay(double amount) {        System.out.println("使用微信支付:" + amount + "元");    }}// 步骤3:定义上下文类(封装策略调用,供客户端使用)public class PaymentContext {    // 持有策略对象    private PaymentStrategy strategy;    // 构造方法:注入策略    public PaymentContext(PaymentStrategy strategy) {        this.strategy = strategy;    }    // 提供统一的支付方法    public void executePay(double amount) {        strategy.pay(amount);    }}// 测试类public class StrategyTest {    public static void main(String[] args) {        // 客户端可以灵活切换策略,无需修改核心逻辑        double amount = 100.0;        // 使用支付宝支付        PaymentContext alipayContext = new PaymentContext(new AlipayStrategy());        alipayContext.executePay(amount); // 输出:使用支付宝支付:100.0元        // 切换为微信支付(仅需替换策略对象)        PaymentContext wechatContext = new PaymentContext(new WechatPayStrategy());        wechatContext.executePay(amount); // 输出:使用微信支付:100.0元    }}

关键点回顾

  1. 1.单例模式:核心是私有构造方法 + 静态唯一实例 + 全局访问方法,饿汉式简单但懒加载差,双重检查锁的懒汉式兼顾性能和线程安全,是首选。
  2. 2.简单工厂模式:将对象创建逻辑集中到工厂类,客户端无需直接 new 对象,降低耦合,但新增产品需修改工厂类(违反开闭原则)。
  3. 3.策略模式:将算法封装为独立策略类,客户端可动态切换算法,核心是策略接口 + 具体策略 + 上下文类,符合开闭原则。

最新文章

随机文章