Java设计模式

单例模式(Singleton Pattern)

定义:确保一个类只有一个实例,并提供一个全局访问点。

原理:通过私有化构造函数和提供一个静态方法来获取实例。

优点:

  • 控制实例数量:保证只有一个实例。

  • 提供全局访问点 :方便在全局范围内访问该实例。

    复制代码
    // 单例类
    public class Singleton {
        // 唯一实例
        private static Singleton instance;
    
        // 私有构造函数,防止外部实例化
        private Singleton() {}
    
        // 提供全局访问点
        public static Singleton getInstance() {
            if (instance == null) {
                instance = new Singleton();  // 懒汉式加载
            }
            return instance;
        }
    }
    工厂方法模式(Factory Method Pattern)

    定义:定义一个创建对象的接口,但由子类决定实例化哪个类。

    原理:将对象的创建逻辑放在子类中,而不是在客户端代码中。

    优点:

  • 灵活性:可以在运行时决定创建对象的类型。

  • 符合开闭原则 :对扩展开放,对修改关闭。

    复制代码
    // 产品接口
    public interface Product {
        void operation();
    }
    
    // 具体产品A
    public class ConcreteProductA implements Product {
        @Override
        public void operation() {
            System.out.println("ConcreteProductA operation");
        }
    }
    
    // 具体产品B
    public class ConcreteProductB implements Product {
        @Override
        public void operation() {
            System.out.println("ConcreteProductB operation");
        }
    }
    
    // 工厂接口
    public abstract class Creator {
        public abstract Product factoryMethod();
    }
    
    // 具体工厂A
    public class ConcreteCreatorA extends Creator {
        @Override
        public Product factoryMethod() {
            return new ConcreteProductA();
        }
    }
    
    // 具体工厂B
    public class ConcreteCreatorB extends Creator {
        @Override
        public Product factoryMethod() {
            return new ConcreteProductB();
        }
    }
    
    // 客户端代码
    public class Client {
        public static void main(String[] args) {
            Creator creator = new ConcreteCreatorA();
            Product product = creator.factoryMethod();
            product.operation();
        }
    }

    抽象工厂模式(Abstract Factory Pattern)

    定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

    原理:通过定义多个工厂接口,每个接口负责创建一组相关的对象。

    优点:

    一致性:确保创建的一系列对象具有一致性。

    扩展性:易于扩展产品系列,而不影响现有代码。

    复制代码
    // 产品A接口
    public interface ProductA {
        void operationA();
    }
    
    // 产品B接口
    public interface ProductB {
        void operationB();
    }
    
    // 具体产品A1
    public class ConcreteProductA1 implements ProductA {
        @Override
        public void operationA() {
            System.out.println("ConcreteProductA1 operationA");
        }
    }
    
    // 具体产品B1
    public class ConcreteProductB1 implements ProductB {
        @Override
        public void operationB() {
            System.out.println("ConcreteProductB1 operationB");
        }
    }
    
    // 具体产品A2
    public class ConcreteProductA2 implements ProductA {
        @Override
        public void operationA() {
            System.out.println("ConcreteProductA2 operationA");
        }
    }
    
    // 具体产品B2
    public class ConcreteProductB2 implements ProductB {
        @Override
        public void operationB() {
            System.out.println("ConcreteProductB2 operationB");
        }
    }
    
    // 抽象工厂接口
    public interface AbstractFactory {
        ProductA createProductA();
        ProductB createProductB();
    }
    
    // 具体工厂1
    public class ConcreteFactory1 implements AbstractFactory {
        @Override
        public ProductA createProductA() {
            return new ConcreteProductA1();
        }
    
        @Override
        public ProductB createProductB() {
            return new ConcreteProductB1();
        }
    }
    
    // 具体工厂2
    public class ConcreteFactory2 implements AbstractFactory {
        @Override
        public ProductA createProductA() {
            return new ConcreteProductA2();
        }
    
        @Override
        public ProductB createProductB() {
            return new ConcreteProductB2();
        }
    }
    
    // 客户端代码
    public class Client {
        public static void main(String[] args) {
            AbstractFactory factory = new ConcreteFactory1();
            ProductA productA = factory.createProductA();
            ProductB productB = factory.createProductB();
            productA.operationA();
            productB.operationB();
        }
    }

    观察者模式(Observer Pattern)

    定义:定义对象之间的一对多依赖,使得当一个对象改变状态时,所有依赖于它的对象都得到通知并被自动更新。

    原理:通过定义观察者接口和被观察者类来实现一对多的通知机制。

    优点:

    解耦:观察者和被观察者之间的解耦。

    动态更新:自动更新所有观察者

    复制代码
    import java.util.ArrayList;
    import
    
     java.util.List;
    
    // 观察者接口
    public interface Observer {
        void update(String message);
    }
    
    // 被观察者接口
    public interface Subject {
        void addObserver(Observer observer);
        void removeObserver(Observer observer);
        void notifyObservers(String message);
    }
    
    // 具体被观察者
    public class ConcreteSubject implements Subject {
        private List<Observer> observers = new ArrayList<>();
    
        @Override
        public void addObserver(Observer observer) {
            observers.add(observer);
        }
    
        @Override
        public void removeObserver(Observer observer) {
            observers.remove(observer);
        }
    
        @Override
        public void notifyObservers(String message) {
            for (Observer observer : observers) {
                observer.update(message);
            }
        }
    }
    
    // 具体观察者
    public class ConcreteObserver implements Observer {
        private String name;
    
        public ConcreteObserver(String name) {
            this.name = name;
        }
    
        @Override
        public void update(String message) {
            System.out.println(name + " received: " + message);
        }
    }
    
    // 客户端代码
    public class Client {
        public static void main(String[] args) {
            ConcreteSubject subject = new ConcreteSubject();
            Observer observer1 = new ConcreteObserver("Observer1");
            Observer observer2 = new ConcreteObserver("Observer2");
            subject.addObserver(observer1);
            subject.addObserver(observer2);
    
            subject.notifyObservers("Hello Observers!");
        }
    }
相关推荐
bkspiderx35 分钟前
基于Socket的广播通信及C语言实现详解
c语言·开发语言·socket·广播·socket的广播通信
小王C语言39 分钟前
Qt常用控件:输入类控件,单行/多行输入框、下拉框、(日期)微调框、旋钮、滑动条
开发语言·qt
ESDWAN43 分钟前
SD-WAN 主备切换为什么仍然会断网?从检测机制到会话恢复分析
开发语言·php
步行cgn1 小时前
StringHttpMessageConverter 详解:Spring MVC 中字符串读写的默认转换器
java·spring·mvc
摇滚侠1 小时前
《On Java 中文版 基础卷》阅读笔记 实现隐藏 11
java·笔记·python
1001101_QIA1 小时前
.exe does not seem to be a Qt executable.
开发语言·qt
小蒜学长1 小时前
基于Spring Boot+Vue3的在线医疗咨询系统的设计与实现(代码+数据库+LW)
java·spring boot·后端·在线问诊·在线医疗咨询系统
Deng桑1 小时前
SpringAI写第一个Agent-把工单循环跑起来
java·agent·工具调用·spring ai
echome8881 小时前
Python 异常处理:try、else、finally 的正确搭配
开发语言·前端·python·异常处理·编程技巧
云和数据.ChenGuang1 小时前
Python 单继承与多继承深度剖析:从 MRO 到实战取舍
开发语言·人工智能·python·langchain