亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

Table of Contents
Singleton Pattern (Use with Caution)
2. Behavioral Patterns: Functional Programming to the Rescue
Strategy Pattern (Now Just a Functional Interface)
Observer Pattern (Use Reactive Streams or Listeners)
3. Structural Patterns: Still Relevant, But Leaner
Decorator Pattern (Enhanced with Lambdas)
Adapter Pattern (Use for Integration)
4. When Not to Use Design Patterns
Final Thoughts
Home Java javaTutorial Design Patterns in Modern Java: A Practical Approach

Design Patterns in Modern Java: A Practical Approach

Aug 02, 2025 am 05:01 AM
java Design Patterns

Design patterns are still related but have evolved in modern Java. 2. Creative patterns are more concise due to Java 8 features, such as Builder is cleaner, Singleton recommends to replace them with DI, 3. Behavioral patterns benefit from functional programming, Strategy can be implemented using functional interfaces, Observer recommends reactive streams or Consumer callbacks, 4. Structural patterns are still applicable but lighter, Decorator can be used to integrate old systems with lambda and Adapter, 5. Avoid over-design, and prioritize the use of modern features such as Supplier and records to simplify the implementation. The ultimate goal is to implement a clear and maintainable solution with less code.

Design Patterns in Modern Java: A Practical Approach

Design patterns in modern Java aren't just religions from the early 2000s—they're still relevant, but how we use them has evolved. With features like lambdas, streams, and functional interfaces introduced in Java 8 and beyond, many classic patterns have simpler, cleaner implementations or are even obsolete. Here's a practical look at how design patterns fit into modern Java development.

Design Patterns in Modern Java: A Practical Approach

1. Creational Patterns: Simpler Than Ever

Creational patterns help manage object creation logic. In modern Java, some of these are streamlined thanks to language enhancements.

Builder Pattern (Still Useful, Now Cleaner)

The Builder pattern is widely used for constructing complex objects, especially immutable ones. With modern Java, you can make it more concise.

Design Patterns in Modern Java: A Practical Approach
 public class User {
    private final String name;
    private final int age;
    private final String email;

    private User(Builder builder) {
        this.name = builder.name;
        this.age = builder.age;
        this.email = builder.email;
    }

    public static class Builder {
        private String name;
        private int age;
        private String email;

        public Builder name(String name) {
            this.name = name;
            return this;
        }

        public Builder age(int age) {
            this.age = age;
            return this;
        }

        public Builder email(String email) {
            this.email = email;
            return this;
        }

        public User build() {
            return new User(this);
        }
    }
}

Usage:

 User user = new User.Builder()
    .name("Alice")
    .age(30)
    .email("alice@example.com")
    .build();

Tip : Use records (Java 14 ) for simple data carriers—no need for builders unless you need validation or optional fields.

Design Patterns in Modern Java: A Practical Approach

Singleton Pattern (Use with Caution)

While still seen in legacy code, the Singleton pattern is often discouraged due to testability and concurrency issues.

A thread-safe, lazy-loaded version:

 public class DatabaseConnection {
    private static volatile DatabaseConnection instance;

    private DatabaseConnection() {}

    public static DatabaseConnection getInstance() {
        if (instance == null) {
            synchronized (DatabaseConnection.class) {
                if (instance == null) {
                    instance = new DatabaseConnection();
                }
            }
        }
        return instance;
    }
}

Modern alternative : Use dependency injection (Spring, Dagger) instead. Let the container manage single instances.


2. Behavioral Patterns: Functional Programming to the Rescue

Modern Java's functional features reduce boilerplate in behavioral patterns.

Strategy Pattern (Now Just a Functional Interface)

Instead of defining multiple classes for strategies, use Function , Predicate , or custom functional interfaces.

 @FunctionalInterface
interface DiscountStrategy {
    double applyDiscount(double amount);
}

// Usage
DiscountStrategy regular = amount -> amount * 0.9;
DiscountStrategy premium = amount -> amount * 0.7;

double finalPrice = premium.applyDiscount(100);

This eliminates the need for interface implementations and makes the code more flexible and testable.


Observer Pattern (Use Reactive Streams or Listeners)

Instead of rolling your own observer setup, leverage modern libraries:

  • Java's PropertyChangeListener (for GUIs)
  • Project Reactor or RxJava for event-driven flows
  • Or simple callbacks with Consumer<T>
 List<Consumer<String>> listeners = new ArrayList<>();

public void onEvent(String event) {
    listeners.forEach(consumer -> consumer.accept(event));
}

// Subscribe
listeners.add(System.out::println);

For complex async flows, go reactive. For simple cases, lambdas work fine.


3. Structural Patterns: Still Relevant, But Leaner

These help structure classes and objects for better flexibility.

Decorator Pattern (Enhanced with Lambdas)

Commonly used in I/O streams (eg, BufferedInputStream wraps FileInputStream ).

You can apply it functionally:

 @FunctionalInterface
interface DataService {
    String fetchData();

    default DataService withLogging(DataService ds) {
        return () -> {
            System.out.println("Fetching data...");
            return ds.fetchData();
        };
    }
}

But prefer composition over complex hierarchies. Modern design favors small, composable components.


Adapter Pattern (Use for Integration)

When integrating with legacy or third-party APIs, the adapter pattern shines.

 class WeatherService {
    public String getWeather() {
        return "Sunny";
    }
}

interface ForecastService {
    String getCurrentForecast();
}

class WeatherAdapter implements ForecastService {
    private WeatherService service;

    public WeatherAdapter(WeatherService service) {
        this.service = service;
    }

    @Override
    public String getCurrentForecast() {
        return "Forecast: " service.getWeather();
    }
}

Use case : Wrapping old APIs to fit modern interfaces—still very practical.


4. When Not to Use Design Patterns

  • Overengineering : Don't force a pattern where a simple method or lambda suffices.
  • Premature abstraction : Wait until duplication or complexity emerges.
  • Using patterns just because : If your team doesn't need it, skip it.

Example : Instead of a full Factory Method pattern, consider a Supplier<T> :

 Map<String, Supplier<Report>> factories = Map.of(
    "PDF", PdfReport::new,
    "CSV", CsvReport::new
);

Report report = factories.get("PDF").get();

Clean, readable, and functional.


Final Thoughts

Design patterns aren't obsolete—they've just matured. Modern Java gives us tools to implement them more elegantly:

  • Use lambdas and functional interfaces to simplify behavioral patterns.
  • Prefer composition and DI over rigid inheritance.
  • Leverage records and var for cleaner data structures.
  • Reach for reactive programming instead of manual observer setups.

The goal isn't to memorize patterns—it's to solve problems clearly and maintainably. With modern Java, you can do that with less code and better readability.

Basically: know the patterns, but don't be a slave to them.

The above is the detailed content of Design Patterns in Modern Java: A Practical Approach. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undress AI Tool

Undress AI Tool

Undress images for free

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Hot Topics

PHP Tutorial
1488
72
VSCode settings.json location VSCode settings.json location Aug 01, 2025 am 06:12 AM

The settings.json file is located in the user-level or workspace-level path and is used to customize VSCode settings. 1. User-level path: Windows is C:\Users\\AppData\Roaming\Code\User\settings.json, macOS is /Users//Library/ApplicationSupport/Code/User/settings.json, Linux is /home//.config/Code/User/settings.json; 2. Workspace-level path: .vscode/settings in the project root directory

How to handle transactions in Java with JDBC? How to handle transactions in Java with JDBC? Aug 02, 2025 pm 12:29 PM

To correctly handle JDBC transactions, you must first turn off the automatic commit mode, then perform multiple operations, and finally commit or rollback according to the results; 1. Call conn.setAutoCommit(false) to start the transaction; 2. Execute multiple SQL operations, such as INSERT and UPDATE; 3. Call conn.commit() if all operations are successful, and call conn.rollback() if an exception occurs to ensure data consistency; at the same time, try-with-resources should be used to manage resources, properly handle exceptions and close connections to avoid connection leakage; in addition, it is recommended to use connection pools and set save points to achieve partial rollback, and keep transactions as short as possible to improve performance.

Mastering Dependency Injection in Java with Spring and Guice Mastering Dependency Injection in Java with Spring and Guice Aug 01, 2025 am 05:53 AM

DependencyInjection(DI)isadesignpatternwhereobjectsreceivedependenciesexternally,promotingloosecouplingandeasiertestingthroughconstructor,setter,orfieldinjection.2.SpringFrameworkusesannotationslike@Component,@Service,and@AutowiredwithJava-basedconfi

Understanding the Java Virtual Machine (JVM) Internals Understanding the Java Virtual Machine (JVM) Internals Aug 01, 2025 am 06:31 AM

TheJVMenablesJava’s"writeonce,runanywhere"capabilitybyexecutingbytecodethroughfourmaincomponents:1.TheClassLoaderSubsystemloads,links,andinitializes.classfilesusingbootstrap,extension,andapplicationclassloaders,ensuringsecureandlazyclassloa

How to work with Calendar in Java? How to work with Calendar in Java? Aug 02, 2025 am 02:38 AM

Use classes in the java.time package to replace the old Date and Calendar classes; 2. Get the current date and time through LocalDate, LocalDateTime and LocalTime; 3. Create a specific date and time using the of() method; 4. Use the plus/minus method to immutably increase and decrease the time; 5. Use ZonedDateTime and ZoneId to process the time zone; 6. Format and parse date strings through DateTimeFormatter; 7. Use Instant to be compatible with the old date types when necessary; date processing in modern Java should give priority to using java.timeAPI, which provides clear, immutable and linear

Google Chrome cannot open local files Google Chrome cannot open local files Aug 01, 2025 am 05:24 AM

ChromecanopenlocalfileslikeHTMLandPDFsbyusing"Openfile"ordraggingthemintothebrowser;ensuretheaddressstartswithfile:///;2.SecurityrestrictionsblockAJAX,localStorage,andcross-folderaccessonfile://;usealocalserverlikepython-mhttp.server8000tor

Understanding Network Ports and Firewalls Understanding Network Ports and Firewalls Aug 01, 2025 am 06:40 AM

Networkportsandfirewallsworktogethertoenablecommunicationwhileensuringsecurity.1.Networkportsarevirtualendpointsnumbered0–65535,withwell-knownportslike80(HTTP),443(HTTPS),22(SSH),and25(SMTP)identifyingspecificservices.2.PortsoperateoverTCP(reliable,c

Comparing Java Frameworks: Spring Boot vs Quarkus vs Micronaut Comparing Java Frameworks: Spring Boot vs Quarkus vs Micronaut Aug 04, 2025 pm 12:48 PM

Pre-formanceTartuptimeMoryusage, Quarkusandmicronautleadduetocompile-Timeprocessingandgraalvsupport, Withquarkusoftenperforminglightbetterine ServerLess scenarios.2.Thyvelopecosyste,

See all articles