在项目中应用设计模式的实践指南

目录

✨✨ 祝屏幕前的您天天开心,每天都有好运相伴。我们一起加油!✨✨
🎈🎈作者主页: 喔的嘛呀🎈🎈

引言

一. 单例模式(Singleton Pattern)

1、实现单例模式的方式

1.1 懒汉式(Lazy Initialization)

1.2. 饿汉式(Eager Initialization)

1.3. 双重检查锁(Double-Checked Locking)

2、在项目中的应用

3、总结

二、 工厂模式(Factory Pattern)

1、工厂模式的实现方式

1.1简单工厂模式(Simple Factory Pattern)

1.2、工厂方法模式(Factory Method Pattern)

2、工厂模式在项目中的应用

3、总结

三. 观察者模式(Observer Pattern)

观察者模式的角色

观察者模式的优点

观察者模式的应用场景

示例代码

总结

四. 策略模式(Strategy Pattern)

策略模式的角色

策略模式的优点

策略模式的应用场景

示例代码

总结

结论


引言

设计模式是软件开发中的重要概念,它提供了一套经过验证的解决方案,可以帮助我们解决常见的设计问题。在项目中合理应用设计模式可以提高代码的质量和可维护性。本文将详细介绍如何在项目中应用设计模式,并提供具体的示例代码来说明。

一. 单例模式(Singleton Pattern)

单例模式用于确保一个类只有一个实例,并提供一个全局访问点。在项目中,单例模式通常用于管理共享资源或全局配置。

单例模式(Singleton Pattern)是一种创建型设计模式,用于确保一个类只有一个实例,并提供一个全局访问点。这种模式非常有用,特别是当一个类需要被多个不同的部分使用时,但我们希望这个类的实例始终保持一致性时。

1、实现单例模式的方式

1.1 懒汉式(Lazy Initialization)

在第一次被调用时才创建实例。

public class Singleton {private static Singleton instance;private Singleton() {}public static Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}
1.2. 饿汉式(Eager Initialization)

在类加载时就创建实例。

public class Singleton {private static Singleton instance = new Singleton();private Singleton() {}public static Singleton getInstance() {return instance;}
}
1.3. 双重检查锁(Double-Checked Locking)

结合懒汉式和同步锁,在保证线程安全的同时减少同步开销。

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;}
}

2、在项目中的应用

在项目中,单例模式经常被用于以下情况:

  1. 日志记录器(Logger):一个应用可能需要一个全局的日志记录器来记录应用中的事件和错误信息。单例模式可以确保所有部分都使用相同的日志记录器实例。

  2. 配置管理器(Configuration Manager):一个应用可能需要一个全局的配置管理器来加载和保存配置信息。单例模式可以确保所有部分都使用相同的配置管理器实例。

  3. 数据库连接池(Database Connection Pool):在需要频繁访问数据库的应用中,可以使用单例模式管理数据库连接池,以避免频繁地创建和销毁连接。

  4. 线程池(Thread Pool):在需要管理多个线程的应用中,可以使用单例模式管理线程池,以便统一管理线程的创建和销毁。

  5. 缓存管理器(Cache Manager):在需要缓存数据的应用中,可以使用单例模式管理缓存,以便统一管理缓存的读写操作。

  6. GUI组件管理器(GUI Component Manager):在需要管理用户界面组件的应用中,可以使用单例模式管理界面组件,以确保所有部分都使用相同的界面组件实例。

以上是单例模式在项目中的一些常见应用场景。在实际项目中,可以根据具体需求和场景来灵活应用单例模式,以提高代码的质量和可维护性。

3、总结

单例模式是一种简单但非常有用的设计模式,在项目中经常被使用。然而,需要注意在多线程环境下保证线程安全,以及避免对单例实例进行破坏性操作(如反序列化)。

二、 工厂模式(Factory Pattern)

工厂模式是一种创建型设计模式,用于创建对象,但将对象的创建逻辑封装在工厂类中,从而实现解耦。工厂模式可以根据不同的条件来创建不同类型的对象,而客户端代码只需要知道如何使用工厂类来获取对象,而不需要知道具体对象的创建细节。

1、工厂模式的实现方式

1.1简单工厂模式(Simple Factory Pattern)

public interface Shape {void draw();
}public class Circle implements Shape {@Overridepublic void draw() {System.out.println("画一个圆形");}
}public class Rectangle implements Shape {@Overridepublic 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;}
}

1.2、工厂方法模式(Factory Method Pattern)

public interface Shape {void draw();
}public class Circle implements Shape {@Overridepublic void draw() {System.out.println("画一个圆形");}
}public class Rectangle implements Shape {@Overridepublic void draw() {System.out.println("画一个矩形");}
}public interface ShapeFactory {Shape createShape();
}public class CircleFactory implements ShapeFactory {@Overridepublic Shape createShape() {return new Circle();}
}public class RectangleFactory implements ShapeFactory {@Overridepublic Shape createShape() {return new Rectangle();}
}

2、工厂模式在项目中的应用

工厂模式在项目中的应用非常广泛,它主要用于创建对象,但将对象的创建逻辑封装在工厂类中,从而实现解耦。以下是工厂模式在项目中常见的应用场景和示例:

  1. 数据库连接工厂:在需要访问数据库的应用中,可以使用数据库连接工厂来创建数据库连接对象,根据不同的数据库类型返回不同的连接对象。
public interface Connection {void connect();
}public class MySqlConnection implements Connection {@Overridepublic void connect() {System.out.println("连接到MySQL数据库");}
}public class OracleConnection implements Connection {@Overridepublic 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 {@Overridepublic void log(String message) {System.out.println("[INFO] " + message);}
}public class ErrorLogger implements Logger {@Overridepublic 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 {@Overridepublic void parse(String filePath) {System.out.println("解析XML文件:" + filePath);}
}public class JsonParser implements Parser {@Overridepublic 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;}
}

3、总结

工厂模式可以帮助我们在项目中实现对象的创建和管理,同时降低了类之间的耦合度,使得代码更加灵活和可维护。在实际项目中,根据具体需求和场景,可以灵活应用工厂模式来提高代码的质量和可扩展性。

三. 观察者模式(Observer Pattern)

观察者模式是一种行为设计模式,用于定义对象间的一对多依赖关系,当一个对象状态发生改变时,所有依赖于它的对象都会收到通知并自动更新。这种模式涉及到两种类型的对象:主题(Subject)和观察者(Observer)。主题维护一组观察者,提供注册和删除观察者的方法,并在状态变化时通知观察者。

观察者模式的角色

  1. Subject(主题):被观察的对象,它维护一组观察者,并提供注册和删除观察者的方法,以及通知观察者的方法。
  2. ConcreteSubject(具体主题):实现主题接口的具体对象,它存储主题的状态,当状态发生变化时通知所有观察者。
  3. Observer(观察者):定义一个更新接口用于接收并响应主题状态的变化。
  4. ConcreteObserver(具体观察者):实现观察者接口的具体对象,当接收到主题通知时执行特定的动作。

观察者模式的优点

  • 松耦合:主题和观察者之间是松耦合的,主题只知道观察者接口,而不需要了解具体的观察者实现。
  • 可扩展性:可以在运行时动态添加新的观察者。
  • 反应性:观察者能够立即对主题的状态变化做出响应。

观察者模式的应用场景

  • 当一个对象的改变需要同时改变其他对象,并且不知道具体有多少对象需要改变时,可以使用观察者模式。
  • 当一个抽象模型有两个方面,其中一个依赖于另一个,使用观察者模式可以将这两者封装在独立的对象中,使它们可以独立地改变和复用。

示例代码

以下是一个简单的观察者模式示例,模拟了一个简单的气象站发布天气信息的场景:

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<Observer> observers;private float temperature;private float humidity;private float pressure;public WeatherData() {observers = new ArrayList<>();}@Overridepublic void registerObserver(Observer observer) {observers.add(observer);}@Overridepublic void removeObserver(Observer observer) {observers.remove(observer);}@Overridepublic 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;@Overridepublic 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 是具体观察者。当气象站的温度发生变化时,会通知所有注册的观察者更新温度信息。

总结

观察者模式的优点包括降低耦合度、支持广播通信和扩展性好。在项目中,观察者模式常用于事件处理、消息通知和状态监控等场景。通过观察者模式,可以使系统的各个部分之间保持松散耦合,提高代码的灵活性和可维护性。

四. 策略模式(Strategy Pattern)

策略模式是一种行为设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以相互替换。策略模式可以让算法独立于使用它的客户端而变化,即客户端可以根据需要在运行时选择算法。在项目中,策略模式可以用于实现不同的算法或行为,使系统更灵活、可扩展和易于维护。

策略模式的角色

  1. Context(上下文):维护一个对策略对象的引用,在需要的时候调用策略对象的算法。
  2. Strategy(策略):定义所有支持的算法的公共接口,通常是一个接口或抽象类。
  3. ConcreteStrategy(具体策略):实现策略接口,提供具体的算法实现。

策略模式的优点

  • 算法独立性:可以在不影响客户端的情况下单独修改或替换算法。
  • 扩展性:易于增加新的算法或行为。
  • 复用性:可以将算法封装成独立的策略类,方便复用。

策略模式的应用场景

  • 当一个系统中有许多类只是在行为上有差别,可以使用策略模式来将这些行为封装到不同的策略类中,使得这些类可以方便地切换行为。
  • 当一个类的某个行为需要在运行时动态地选择时,可以使用策略模式。

示例代码

以下是一个简单的策略模式示例,模拟了一个电商系统根据不同的促销策略计算折扣价格的场景:

// 策略接口
interface DiscountStrategy {double applyDiscount(double amount);
}// 具体策略:打折策略
class PercentageDiscountStrategy implements DiscountStrategy {private double percentage;public PercentageDiscountStrategy(double percentage) {this.percentage = percentage;}@Overridepublic 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;}@Overridepublic 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 是策略接口,PercentageDiscountStrategyFullReductionDiscountStrategy 是具体策略。ShoppingCart 类是上下文,根据不同的促销策略计算折扣价格。

总结

总的来说,策略模式可以让算法的变化独立于使用算法的客户端,使得系统更灵活、可扩展和易于维护。

结论

设计模式是软件开发中的重要概念,通过合理应用设计模式,可以提高代码的质量和可维护性。在项目中应用设计模式需要根据具体情况选择合适的模式,并遵循设计模式的原则和规范。希望本文能帮助读者更好地理解和应用设计模式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/487688.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高刷电竞显示器 - HKC VG253KM

今天给大家分享一款高刷电竞显示器 - HKC VG253KM。 高刷电竞显示器 - HKC VG253KM源于雄鹰展翅翱翔的设计灵感&#xff0c;严格遵循黄金分割比例的蓝色点晴线条&#xff0c;加上雾面工艺及高低起伏错落有致的线条处理&#xff0c;在VG253KM的背部勾勒出宛若大鹏展翅的鹰翼图腾…

使用HiveMQ实现Android MQTT

MQTT官网&#xff1a;https://mqtt.org/ 百度Android MQTT&#xff0c;或者B站上搜索&#xff0c;发现大多使用https://github.com/eclipse/paho.mqtt.android&#xff0c;这是Eclipse的一个Android MQTT客户端实现库&#xff0c;但是我发现这个库在运行到高版本的手机上时报错…

ShardingSphere 5.x 系列【15】分布式主键生成器

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 3.1.0 本系列ShardingSphere 版本 5.4.0 源码地址:https://gitee.com/pearl-organization/study-sharding-sphere-demo 文章目录 1. 概述2. 配置3. 内置算法3.1 UUID3.2 Snowflake3.3 NanoId3.4 CosId3.5 Co…

面试经典150题 -- 二叉树 (总结)

总的地址 : 面试经典 150 题 - 学习计划 - 力扣&#xff08;LeetCode&#xff09;全球极客挚爱的技术成长平台 104 . 二叉树的最大深度 104 . 二叉树的最大深度 递归 : 直接用递归访问 &#xff0c; 访问左孩子 和 右孩子 &#xff0c; 如果 存在 &#xff0c; 深度就1 &…

简单实现文字滚动效果-CSS版本

先看看效果 话不多说直接上代码 <template><div class"main"><div class"scroll-region"><div class"swiper-scroll-content"><span class"list-btn" v-for"(item, index) in overviewList" :…

AI生成图片网站测评

主要测评文章配图生成效果、绘制logo等效果 测评关键点&#xff1a;生成效果、网站易用度、是否免费 测评prompt&#xff1a;请生成一个文章内容配图&#xff0c;图片比例是3&#xff1a;2&#xff0c;文章主旨是AI既是机遇&#xff0c;也存在挑战和风险&#xff0c;要求图片…

【Web前端笔记11】JavaScript基础与变量

前言 11 JavaScript基础与变量 一、Js简介 1、JavaScript核心部分&#xff1a; 2、有非常广泛的使用领域 3、JavaScript与ECMAScript的关系 4、JavaScript版本 二、JavaScript名词解释 三、变量命名规则 四、变量类型 六大基本数据类型&#xff1a; 1、数字类型 2、…

【Java程序设计】【C00287】基于Springboot的疫情防控期间某村外出务工人员管理系统(有论文)

基于Springboot的疫情防控期间某村外出务工人员管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的疫情防控期间某村外出务工人员信息管理系统 本系统分为系统功能模块、管理员功能模块、用户功能模块、采集…

汽修专用产品---选型介绍 汽修示波器 汽车示波器 汽车电子 汽修波形 汽车传感器波形 汽车检测

为了满足汽车电子用户的测量需求&#xff0c;我司特推出汽修专用版示波器&#xff0c;一键测量&#xff0c;轻松找出汽车问题。 LOTO各种型号的示波器其实都可以用作汽车传感器信号波形的检测。汽修应用中&#xff0c;工程师对示波器的性能要求对于LOTO产品来说不算高。 在我们…

axure9.0 工具使用思考

原型设计软件【AxureRP】快速原型设计工具原型设计软件【AxureRP】快速原型设计工具原型设计软件【AxureRP】快速原型设计工具原型设计软件【AxureRP】快速原型设计工具原型设计软件【AxureRP】快速原型设计工具原型设计软件【AxureRP】快速原型设计工具原型设计软件【AxureRP】…

小程序画布(二维地图线)

首先开始是想用小程序兼容openlayers的&#xff0c;但是了解到用不了&#xff0c;那就用画布来解决 实际效果如下 wxml中代码 <canvas id"trackDesignCanvas" //指定 id 的 Canvas 组件class"orbit-canvas-main" type"2d" …

C++的vector容器->基本概念、构造函数、赋值操作、容量和大小、插入和删除、数据存取、互换容器、预留空间

#include<iostream> using namespace std; #include <vector> //vector容器构造 void printVector(vector<int>& v) { for (vector<int>::iterator it v.begin(); it ! v.end(); it) { cout << *it << " "…