• Java常用的设计模式,如单例模式、工厂模式、观察者模式等


    设计模式是软件工程中的一种解决方案,用于应对常见的设计问题和挑战。它们提供了一种标准化的方式来解决设计难题,使代码更加灵活、可扩展和易于维护。

    单例模式(Singleton Pattern)

    概述

    单例模式确保一个类只有一个实例,并提供一个全局访问点来访问这个实例。这在需要全局共享资源时非常有用,例如数据库连接池、配置管理器等。

    实现

    在Java中,实现单例模式有多种方式,以下是最常见的几种:

    饿汉式(Eager Initialization)
    1. public class Singleton {
    2. private static final Singleton instance = new Singleton();
    3. private Singleton() {
    4. // 私有构造函数,防止实例化
    5. }
    6. public static Singleton getInstance() {
    7. return instance;
    8. }
    9. }

    这种方法在类加载时就创建实例,线程安全,但如果实例过大且未被使用,会浪费资源。

    懒汉式(Lazy Initialization)
    1. public class Singleton {
    2. private static Singleton instance;
    3. private Singleton() {
    4. // 私有构造函数,防止实例化
    5. }
    6. public static synchronized Singleton getInstance() {
    7. if (instance == null) {
    8. instance = new Singleton();
    9. }
    10. return instance;
    11. }
    12. }

    这种方法在第一次调用时才创建实例,节省资源,但需要同步以确保线程安全。

    双重检查锁(Double-Checked Locking)
    1. public class Singleton {
    2. private static volatile Singleton instance;
    3. private Singleton() {
    4. // 私有构造函数,防止实例化
    5. }
    6. public static Singleton getInstance() {
    7. if (instance == null) {
    8. synchronized (Singleton.class) {
    9. if (instance == null) {
    10. instance = new Singleton();
    11. }
    12. }
    13. }
    14. return instance;
    15. }
    16. }

    这种方法结合了懒汉式的延迟加载和线程安全的优点。

    静态内部类(Static Inner Class)
    1. public class Singleton {
    2. private Singleton() {
    3. // 私有构造函数,防止实例化
    4. }
    5. private static class Holder {
    6. private static final Singleton INSTANCE = new Singleton();
    7. }
    8. public static Singleton getInstance() {
    9. return Holder.INSTANCE;
    10. }
    11. }

    这种方法利用类加载机制实现延迟加载,且线程安全。

    工厂模式(Factory Pattern)

    概述

    工厂模式通过创建一个工厂类来处理对象的创建,提供了一种将实例化逻辑与使用逻辑分离的方式。常见的工厂模式有简单工厂模式、工厂方法模式和抽象工厂模式。

    实现
    简单工厂模式(Simple Factory Pattern)
    1. public class SimpleFactory {
    2. public Product createProduct(String type) {
    3. if (type.equals("A")) {
    4. return new ProductA();
    5. } else if (type.equals("B")) {
    6. return new ProductB();
    7. }
    8. return null;
    9. }
    10. }

    这种方法通过一个工厂类创建不同类型的产品实例。

    工厂方法模式(Factory Method Pattern)
    1. public interface Product {
    2. void use();
    3. }
    4. public class ProductA implements Product {
    5. public void use() {
    6. System.out.println("Using Product A");
    7. }
    8. }
    9. public class ProductB implements Product {
    10. public void use() {
    11. System.out.println("Using Product B");
    12. }
    13. }
    14. public abstract class Factory {
    15. public abstract Product createProduct();
    16. }
    17. public class FactoryA extends Factory {
    18. public Product createProduct() {
    19. return new ProductA();
    20. }
    21. }
    22. public class FactoryB extends Factory {
    23. public Product createProduct() {
    24. return new ProductB();
    25. }
    26. }

    这种方法通过定义一个抽象工厂接口和具体工厂类,提供了灵活的产品创建方式。

    抽象工厂模式(Abstract Factory Pattern)
    1. public interface AbstractFactory {
    2. ProductA createProductA();
    3. ProductB createProductB();
    4. }
    5. public class ConcreteFactory1 implements AbstractFactory {
    6. public ProductA createProductA() {
    7. return new ProductA1();
    8. }
    9. public ProductB createProductB() {
    10. return new ProductB1();
    11. }
    12. }
    13. public class ConcreteFactory2 implements AbstractFactory {
    14. public ProductA createProductA() {
    15. return new ProductA2();
    16. }
    17. public ProductB createProductB() {
    18. return new ProductB2();
    19. }
    20. }

    这种方法提供了创建一系列相关或依赖对象的接口,而无需指定它们的具体类。

    观察者模式(Observer Pattern)

    概述

    观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当主题对象发生变化时,它会通知所有观察者,使它们能够自动更新。

    实现
    1. import java.util.ArrayList;
    2. import java.util.List;
    3. public interface Observer {
    4. void update(String message);
    5. }
    6. public class ConcreteObserver implements Observer {
    7. private String name;
    8. public ConcreteObserver(String name) {
    9. this.name = name;
    10. }
    11. public void update(String message) {
    12. System.out.println(name + " received message: " + message);
    13. }
    14. }
    15. public interface Subject {
    16. void attach(Observer observer);
    17. void detach(Observer observer);
    18. void notifyObservers();
    19. }
    20. public class ConcreteSubject implements Subject {
    21. private List observers = new ArrayList<>();
    22. private String message;
    23. public void attach(Observer observer) {
    24. observers.add(observer);
    25. }
    26. public void detach(Observer observer) {
    27. observers.remove(observer);
    28. }
    29. public void notifyObservers() {
    30. for (Observer observer : observers) {
    31. observer.update(message);
    32. }
    33. }
    34. public void setMessage(String message) {
    35. this.message = message;
    36. notifyObservers();
    37. }
    38. }

    这种方法通过定义主题和观察者接口,确保观察者可以被通知到主题的任何变化。

    其他常见设计模式

    适配器模式(Adapter Pattern)

    适配器模式将一个类的接口转换成客户希望的另一个接口,使原本接口不兼容的类可以一起工作。

    1. public interface Target {
    2. void request();
    3. }
    4. public class Adaptee {
    5. public void specificRequest() {
    6. System.out.println("Specific request");
    7. }
    8. }
    9. public class Adapter implements Target {
    10. private Adaptee adaptee;
    11. public Adapter(Adaptee adaptee) {
    12. this.adaptee = adaptee;
    13. }
    14. public void request() {
    15. adaptee.specificRequest();
    16. }
    17. }
    装饰器模式(Decorator Pattern)

    装饰器模式动态地给对象添加一些额外的职责。相比生成子类,更加灵活。

    1. public interface Component {
    2. void operation();
    3. }
    4. public class ConcreteComponent implements Component {
    5. public void operation() {
    6. System.out.println("ConcreteComponent operation");
    7. }
    8. }
    9. public abstract class Decorator implements Component {
    10. protected Component component;
    11. public Decorator(Component component) {
    12. this.component = component;
    13. }
    14. public void operation() {
    15. component.operation();
    16. }
    17. }
    18. public class ConcreteDecorator extends Decorator {
    19. public ConcreteDecorator(Component component) {
    20. super(component);
    21. }
    22. public void operation() {
    23. super.operation();
    24. additionalOperation();
    25. }
    26. private void additionalOperation() {
    27. System.out.println("Additional operation");
    28. }
    29. }
    策略模式(Strategy Pattern)

    策略模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,客户端可以选择不同的算法实现。

    1. public interface Strategy {
    2. void execute();
    3. }
    4. public class ConcreteStrategyA implements Strategy {
    5. public void execute() {
    6. System.out.println("Strategy A executed");
    7. }
    8. }
    9. public class ConcreteStrategyB implements Strategy {
    10. public void execute() {
    11. System.out.println("Strategy B executed");
    12. }
    13. }
    14. public class Context {
    15. private Strategy strategy;
    16. public Context(Strategy strategy) {
    17. this.strategy = strategy;
    18. }
    19. public void executeStrategy() {
    20. strategy.execute();
    21. }
    22. }
    外观模式(Facade Pattern)

    外观模式为一组复杂的子系统提供一个更高级的统一接口,使子系统更容易使用。

    1. public class SubsystemA {
    2. public void operationA() {
    3. System.out.println("Subsystem A operation");
    4. }
    5. }
    6. public class SubsystemB {
    7. public void operationB() {
    8. System.out.println("Subsystem B operation");
    9. }
    10. }
    11. public class Facade {
    12. private SubsystemA subsystemA;
    13. private SubsystemB subsystemB;
    14. public Facade() {
    15. subsystemA = new SubsystemA();
    16. subsystemB = new SubsystemB();
    17. }
    18. public void operation() {
    19. subsystemA.operationA();
    20. subsystemB.operationB();
    21. }
    22. }
    模板方法模式(Template Method Pattern)

    模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中实现,使得子类可以不改变算法结构的情况下重新定义算法的某些步骤。

    1. public abstract class AbstractClass {
    2. public final void templateMethod() {
    3. primitiveOperation1();
    4. primitiveOperation2();
    5. concreteOperation();
    6. }
    7. protected abstract void primitiveOperation1();
    8. protected abstract void primitiveOperation2();
    9. private void concreteOperation() {
    10. System.out.println("Concrete operation");
    11. }
    12. }
    13. public class ConcreteClass extends AbstractClass {
    14. protected void primitiveOperation1() {
    15. System.out.println("Primitive operation 1");
    16. }
    17. protected void primitiveOperation2() {
    18. System.out.println("Primitive operation 2");
    19. }
    20. }

    设计模式是软件开发中的重要工具,能够显著提高代码的可维护性、灵活性和可扩展性。掌握这些模式并灵活应用,可以帮助开发者更好地设计和构建高质量的软件系统。

    黑马程序员免费预约咨询

  • 相关阅读:
    Kafka消息队列
    SpringCloud原生组件之OpenFeign远程调用
    23模式---原型模式(浅拷贝和深拷贝)
    【每日一题】318. 最大单词长度乘积-2023.11.6
    Python中以更简洁的方式处理异常,使用装饰器
    spring cloud gateWay集成knife4j实现文档聚合
    MyBatisPlus 分页查询
    POC&EXP编写—EXP编写实战(1)
    Express中的JWT使用
    基于javaweb的在线化妆品商城系统(java+ssm+jsp+js+bootstrap+mysql)
  • 原文地址:https://blog.csdn.net/Itmastergo/article/details/139645924