目录
1.2. 饿汉式(Eager Initialization)
1.3. 双重检查锁(Double-Checked Locking)
1.1简单工厂模式(Simple Factory Pattern)
1.2、工厂方法模式(Factory Method Pattern)
设计模式是软件开发中的重要概念,它提供了一套经过验证的解决方案,可以帮助我们解决常见的设计问题。在项目中合理应用设计模式可以提高代码的质量和可维护性。本文将详细介绍如何在项目中应用设计模式,并提供具体的示例代码来说明。
单例模式用于确保一个类只有一个实例,并提供一个全局访问点。在项目中,单例模式通常用于管理共享资源或全局配置。
单例模式(Singleton Pattern)是一种创建型设计模式,用于确保一个类只有一个实例,并提供一个全局访问点。这种模式非常有用,特别是当一个类需要被多个不同的部分使用时,但我们希望这个类的实例始终保持一致性时。
在第一次被调用时才创建实例。
- public class Singleton {
- private static Singleton instance;
-
- private Singleton() {}
-
- public static Singleton getInstance() {
- if (instance == null) {
- instance = new Singleton();
- }
- return instance;
- }
- }
在类加载时就创建实例。
- public class Singleton {
- private static Singleton instance = new Singleton();
-
- private Singleton() {}
-
- public static Singleton getInstance() {
- return instance;
- }
- }
结合懒汉式和同步锁,在保证线程安全的同时减少同步开销。
- public class Singleton {
- private volatile static Singleton instance;
-
- private Singleton() {}
-
- public static Singleton getInstance() {
- if (instance == null) {
- synchronized (Singleton.class) {
- if (instance == null) {
- instance = new Singleton();
- }
- }
- }
- return instance;
- }
- }
在项目中,单例模式经常被用于以下情况:
日志记录器(Logger):一个应用可能需要一个全局的日志记录器来记录应用中的事件和错误信息。单例模式可以确保所有部分都使用相同的日志记录器实例。
配置管理器(Configuration Manager):一个应用可能需要一个全局的配置管理器来加载和保存配置信息。单例模式可以确保所有部分都使用相同的配置管理器实例。
数据库连接池(Database Connection Pool):在需要频繁访问数据库的应用中,可以使用单例模式管理数据库连接池,以避免频繁地创建和销毁连接。
线程池(Thread Pool):在需要管理多个线程的应用中,可以使用单例模式管理线程池,以便统一管理线程的创建和销毁。
缓存管理器(Cache Manager):在需要缓存数据的应用中,可以使用单例模式管理缓存,以便统一管理缓存的读写操作。
GUI组件管理器(GUI Component Manager):在需要管理用户界面组件的应用中,可以使用单例模式管理界面组件,以确保所有部分都使用相同的界面组件实例。
以上是单例模式在项目中的一些常见应用场景。在实际项目中,可以根据具体需求和场景来灵活应用单例模式,以提高代码的质量和可维护性。
单例模式是一种简单但非常有用的设计模式,在项目中经常被使用。然而,需要注意在多线程环境下保证线程安全,以及避免对单例实例进行破坏性操作(如反序列化)。
工厂模式是一种创建型设计模式,用于创建对象,但将对象的创建逻辑封装在工厂类中,从而实现解耦。工厂模式可以根据不同的条件来创建不同类型的对象,而客户端代码只需要知道如何使用工厂类来获取对象,而不需要知道具体对象的创建细节。
- public interface Shape {
- void draw();
- }
-
- public class Circle implements Shape {
- @Override
- public void draw() {
- System.out.println("画一个圆形");
- }
- }
-
- public class Rectangle implements Shape {
- @Override
- public void draw() {
- System.out.println("画一个矩形");
- }
- }
-
- public class ShapeFactory {
- public Shape getShape(String shapeType) {
- if (shapeType == null) {
- return null;
- }
- if (shapeType.equalsIgnoreCase("circle")) {
- return new Circle();
- } else if (shapeType.equalsIgnoreCase("rectangle")) {
- return new Rectangle();
- }
- return null;
- }
- }
- public interface Shape {
- void draw();
- }
-
- public class Circle implements Shape {
- @Override
- public void draw() {
- System.out.println("画一个圆形");
- }
- }
-
- public class Rectangle implements Shape {
- @Override
- public void draw() {
- System.out.println("画一个矩形");
- }
- }
-
- public interface ShapeFactory {
- Shape createShape();
- }
-
- public class CircleFactory implements ShapeFactory {
- @Override
- public Shape createShape() {
- return new Circle();
- }
- }
-
- public class RectangleFactory implements ShapeFactory {
- @Override
- public Shape createShape() {
- return new Rectangle();
- }
- }
工厂模式在项目中的应用非常广泛,它主要用于创建对象,但将对象的创建逻辑封装在工厂类中,从而实现解耦。以下是工厂模式在项目中常见的应用场景和示例:
- public interface Connection {
- void connect();
- }
-
- public class MySqlConnection implements Connection {
- @Override
- public void connect() {
- System.out.println("连接到MySQL数据库");
- }
- }
-
- public class OracleConnection implements Connection {
- @Override
- public void connect() {
- System.out.println("连接到Oracle数据库");
- }
- }
-
- public class ConnectionFactory {
- public static Connection getConnection(String dbType) {
- if ("mysql".equalsIgnoreCase(dbType)) {
- return new MySqlConnection();
- } else if ("oracle".equalsIgnoreCase(dbType)) {
- return new OracleConnection();
- }
- return null;
- }
- }
日志记录器工厂:在需要记录日志的应用中,可以使用日志记录器工厂来创建日志记录器对象,根据不同的日志级别返回不同的日志记录器对象。
- public interface Logger {
- void log(String message);
- }
-
- public class InfoLogger implements Logger {
- @Override
- public void log(String message) {
- System.out.println("[INFO] " + message);
- }
- }
-
- public class ErrorLogger implements Logger {
- @Override
- public void log(String message) {
- System.out.println("[ERROR] " + message);
- }
- }
-
- public class LoggerFactory {
- public static Logger getLogger(String logLevel) {
- if ("info".equalsIgnoreCase(logLevel)) {
- return new InfoLogger();
- } else if ("error".equalsIgnoreCase(logLevel)) {
- return new ErrorLogger();
- }
- return null;
- }
- }
文件解析器工厂:在需要解析不同类型文件的应用中,可以使用文件解析器工厂来创建文件解析器对象,根据不同的文件类型返回不同的解析器对象。
- public interface Parser {
- void parse(String filePath);
- }
-
- public class XmlParser implements Parser {
- @Override
- public void parse(String filePath) {
- System.out.println("解析XML文件:" + filePath);
- }
- }
-
- public class JsonParser implements Parser {
- @Override
- public void parse(String filePath) {
- System.out.println("解析JSON文件:" + filePath);
- }
- }
-
- public class ParserFactory {
- public static Parser getParser(String fileType) {
- if ("xml".equalsIgnoreCase(fileType)) {
- return new XmlParser();
- } else if ("json".equalsIgnoreCase(fileType)) {
- return new JsonParser();
- }
- return null;
- }
- }
工厂模式可以帮助我们在项目中实现对象的创建和管理,同时降低了类之间的耦合度,使得代码更加灵活和可维护。在实际项目中,根据具体需求和场景,可以灵活应用工厂模式来提高代码的质量和可扩展性。
观察者模式是一种行为设计模式,用于定义对象间的一对多依赖关系,当一个对象状态发生改变时,所有依赖于它的对象都会收到通知并自动更新。这种模式涉及到两种类型的对象:主题(Subject)和观察者(Observer)。主题维护一组观察者,提供注册和删除观察者的方法,并在状态变化时通知观察者。
以下是一个简单的观察者模式示例,模拟了一个简单的气象站发布天气信息的场景:
- import java.util.ArrayList;
- import java.util.List;
-
- // 主题接口
- interface Subject {
- void registerObserver(Observer observer);
- void removeObserver(Observer observer);
- void notifyObservers();
- }
-
- // 观察者接口
- interface Observer {
- void update(float temperature, float humidity, float pressure);
- }
-
- // 具体主题
- class WeatherData implements Subject {
- private List
observers; - private float temperature;
- private float humidity;
- private float pressure;
-
- public WeatherData() {
- observers = new ArrayList<>();
- }
-
- @Override
- public void registerObserver(Observer observer) {
- observers.add(observer);
- }
-
- @Override
- public void removeObserver(Observer observer) {
- observers.remove(observer);
- }
-
- @Override
- public void notifyObservers() {
- for (Observer observer : observers) {
- observer.update(temperature, humidity, pressure);
- }
- }
-
- public void measurementsChanged() {
- notifyObservers();
- }
-
- public void setMeasurements(float temperature, float humidity, float pressure) {
- this.temperature = temperature;
- this.humidity = humidity;
- this.pressure = pressure;
- measurementsChanged();
- }
- }
-
- // 具体观察者
- class CurrentConditionsDisplay implements Observer {
- private float temperature;
- private float humidity;
-
- @Override
- public void update(float temperature, float humidity, float pressure) {
- this.temperature = temperature;
- this.humidity = humidity;
- display();
- }
-
- public void display() {
- System.out.println("Current conditions: " + temperature + "F degrees and " + humidity + "% humidity");
- }
- }
-
- public class WeatherStation {
- public static void main(String[] args) {
- WeatherData weatherData = new WeatherData();
-
- CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay();
-
- weatherData.registerObserver(currentDisplay);
-
- weatherData.setMeasurements(80, 65, 30.4f);
- }
- }
在这个示例中,WeatherData 是具体主题,Display 是具体观察者。当气象站的温度发生变化时,会通知所有注册的观察者更新温度信息。
观察者模式的优点包括降低耦合度、支持广播通信和扩展性好。在项目中,观察者模式常用于事件处理、消息通知和状态监控等场景。通过观察者模式,可以使系统的各个部分之间保持松散耦合,提高代码的灵活性和可维护性。
策略模式是一种行为设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以相互替换。策略模式可以让算法独立于使用它的客户端而变化,即客户端可以根据需要在运行时选择算法。在项目中,策略模式可以用于实现不同的算法或行为,使系统更灵活、可扩展和易于维护。
以下是一个简单的策略模式示例,模拟了一个电商系统根据不同的促销策略计算折扣价格的场景:
- // 策略接口
- interface DiscountStrategy {
- double applyDiscount(double amount);
- }
-
- // 具体策略:打折策略
- class PercentageDiscountStrategy implements DiscountStrategy {
- private double percentage;
-
- public PercentageDiscountStrategy(double percentage) {
- this.percentage = percentage;
- }
-
- @Override
- public double applyDiscount(double amount) {
- return amount * (1 - percentage);
- }
- }
-
- // 具体策略:满减策略
- class FullReductionDiscountStrategy implements DiscountStrategy {
- private double full;
- private double reduction;
-
- public FullReductionDiscountStrategy(double full, double reduction) {
- this.full = full;
- this.reduction = reduction;
- }
-
- @Override
- public double applyDiscount(double amount) {
- return amount >= full ? amount - reduction : amount;
- }
- }
-
- // 上下文
- class ShoppingCart {
- private DiscountStrategy discountStrategy;
-
- public void setDiscountStrategy(DiscountStrategy discountStrategy) {
- this.discountStrategy = discountStrategy;
- }
-
- public double checkout(double amount) {
- return discountStrategy.applyDiscount(amount);
- }
- }
-
- public class StrategyPatternExample {
- public static void main(String[] args) {
- ShoppingCart cart = new ShoppingCart();
-
- // 使用打折策略
- cart.setDiscountStrategy(new PercentageDiscountStrategy(0.1));
- double discountedPrice = cart.checkout(100);
- System.out.println("打折后价格:" + discountedPrice);
-
- // 使用满减策略
- cart.setDiscountStrategy(new FullReductionDiscountStrategy(200, 50));
- discountedPrice = cart.checkout(250);
- System.out.println("满减后价格:" + discountedPrice);
- }
- }
在这个示例中,DiscountStrategy 是策略接口,PercentageDiscountStrategy 和 FullReductionDiscountStrategy 是具体策略。ShoppingCart 类是上下文,根据不同的促销策略计算折扣价格。
总的来说,策略模式可以让算法的变化独立于使用算法的客户端,使得系统更灵活、可扩展和易于维护。
设计模式是软件开发中的重要概念,通过合理应用设计模式,可以提高代码的质量和可维护性。在项目中应用设计模式需要根据具体情况选择合适的模式,并遵循设计模式的原则和规范。希望本文能帮助读者更好地理解和应用设计模式。