设计模式示例

单例模式示例

单例模式是一种常用的软件设计模式,其目的是确保一个类只有一个实例,并提供一个全局访问点。以下是一个简单的单例模式示例:

java

public class Singleton {// 私有静态实例,防止被引用,此处赋值为null,目的是实现延迟加载private static Singleton instance = null;// 私有构造方法,防止被实例化private Singleton() {}// 静态工厂方法,创建实例public static Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}

在这个例子中,Singleton 类有一个私有的静态变量 instance,它用于存储类的唯一实例。Singleton 类有一个私有的构造方法,防止外部通过 new 关键字创建实例。getInstance 方法用于返回 instance 变量的值,如果 instance 为 null,则创建一个新的 Singleton 实例并返回。

这种方式实现的单例模式被称为“懒汉模式”,因为实例是在第一次调用 getInstance 方法时创建的。这种方式的优点是实现了延迟加载,但缺点是在多线程环境下可能会创建多个实例。为了解决这个问题,可以使用“双重检查锁定”模式:

 

java

复制

public class Singleton {// 私有静态实例,防止被引用,此处赋值为null,目的是实现延迟加载private static volatile Singleton instance = null;// 私有构造方法,防止被实例化private Singleton() {}// 静态工厂方法,创建实例public static Singleton getInstance() {if (instance == null) {synchronized (Singleton.class ) {if (instance == null) {instance = new Singleton();}}}return instance;}
}

在这个例子中,instance 变量被声明为 volatile,以确保在多线程环境下,instance 的值在第一次创建后不会被重排序。这样可以保证 instance 的值在多线程环境下的一致性。

策略模式示例

以下是一个使用Java实现策略模式的简单示例,展示了策略模式的应用场景。首先定义一个接口,表示商品的促销策略:```java
public interface PromotionStrategy {double applyPromotion(double price);
}
```然后实现具体的促销策略类:```java
public class NormalPromotion implements PromotionStrategy {@Overridepublic double applyPromotion(double price) {return price;}
}public class DiscountPromotion implements PromotionStrategy {private double discountRate;public DiscountPromotion(double discountRate) {this.discountRate = discountRate;}@Overridepublic double applyPromotion(double price) {return price * (1 - discountRate);}
}public class FullReductionPromotion implements PromotionStrategy {private double fullAmount;private double reductionAmount;public FullReductionPromotion(double fullAmount, double reductionAmount) {this.fullAmount = fullAmount;this.reductionAmount = reductionAmount;}@Overridepublic double applyPromotion(double price) {if (price >= fullAmount) {return price - reductionAmount;}return price;}
}
```最后,在商品类中使用策略模式:```java
public class Product {private String name;private double price;private PromotionStrategy promotionStrategy;public Product(String name, double price, PromotionStrategy promotionStrategy) {this.name = name;this.price = price;this.promotionStrategy = promotionStrategy;}public double applyPromotion() {return promotionStrategy.applyPromotion(price);}public static void main(String[] args) {Product product = new Product("iPhone", 1000, new NormalPromotion());System.out.println(product.applyPromotion());  // 输出 1000product = new Product("iPhone", 1000, new DiscountPromotion(0.2));System.out.println(product.applyPromotion());  // 输出 800product = new Product("iPhone", 1000, new FullReductionPromotion(800, 100));System.out.println(product.applyPromotion());  // 输出 700}
}
```在这个示例中,通过使用策略模式,我们实现了不同的促销策略类并应用在商品类中,从而使得商品类的促销策略可以灵活地切换。这种方式下,商品类不需要直接实现具体的促销算法,而是通过组合不同的促销策略对象来实现不同的促销方式。以上是一个简单的策略模式的Java实现示例,希望对您理解策略模式有所帮助。在实际应用中,您可以根据具体需求设计和实现不同的策略类,从而实现更加灵活和可扩展的系统设计。

代理模式示例

以下是一个使用Java实现代理模式的简单示例,展示了静态代理的应用场景。首先定义一个接口,表示需要代理的服务:```java
public interface DataService {void fetchData();
}
```然后实现具体的服务类:```java
public class DataServiceImpl implements DataService {@Overridepublic void fetchData() {System.out.println("从数据库中获取数据");}
}
```接着定义一个代理类,用于代理服务类的操作:```java
public class DataProxy implements DataService {private final DataService dataService;public DataProxy(DataService dataService) {this.dataService = dataService;}@Overridepublic void fetchData() {System.out.println("代理类在调用服务前进行日志记录");dataService.fetchData();System.out.println("代理类在调用服务后进行日志记录");}
}
```最后,在客户端代码中使用代理对象来访问服务对象:```java
public class Main {public static void main(String[] args) {DataService realService = new DataServiceImpl();DataProxy proxy = new DataProxy(realService);proxy.fetchData();}
}
```在这个示例中,`DataServiceImpl`是具体的服务类,实现了`DataService`接口中的`fetchData`方法。`DataProxy`是代理类,通过组合一个实际的服务对象`DataService`来代理其操作,并在调用服务前后添加了日志记录的功能。在`Main`类中创建了实际的服务对象和代理对象,通过代理对象来访问服务对象。这样,代理模式帮助我们控制和管理对服务对象的访问,并可以在代理类中添加额外的功能,而不影响实际服务类的代码。这种方式有助于降低耦合度、提高安全性和可维护性。希望这个示例能帮助理解Java中代理模式的应用。您可以根据实际需求,在更复杂的场景下灵活运用代理模式。

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

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

相关文章

【算法分析与设计】全排列

📝个人主页:五敷有你 🔥系列专栏:算法分析与设计 ⛺️稳中求进,晒太阳 题目 给定一个不含重复数字的整数数组 nums ,返回其 所有可能的全排列 。可以 按任意顺序 返回答案。 示例 示例 1&#xff1…

Transformer 结构浅析

Transformer 结构浅析 文章目录 Transformer 结构浅析Transformer 网络结构编码器位置编码多头注意力层Add&NormFeed Forward 解码器带掩码的多头注意力层多头注意力层 预测 Transformer 网络结构 Transformer模型的网络结构如图,且transformer结构主要分为两部…

二叉搜索树--搜索二维矩阵 II

题目描述 编写一个高效的算法来搜索 m * n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性: 每行的元素从左到右升序排列。每列的元素从上到下升序排列。 示例 1: 输入:matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,…

unordered_map 值类型为函数指针概述

在C中,unordered_map是一种关联容器,可以存储键值对。如果你想在unordered_map中定义的值是有参函数,你可以使用std::function和std::bind来实现。 以下是一个简单的例子,展示了如何在unordered_map中存储有参函数,并…

HarmonyOS4 页面路由

Index.ets: import router from ohos.routerclass RouterInfo {// 页面路径url: string// 页面标题title: stringconstructor(url: string, title: string) {this.url urlthis.title title} }Entry // 入口組件 Component struct Index {State message: string 页面列表// …

react17+antd4 动态渲染导航菜单中的icon

在路由信息对照表中的icon可以有两种形式:一种是组件形式,一种是字符串形式的。 在antd4的Menu.Item和SubMenu中的icon属性的格式为: 1.组件形式 这种方法在渲染时很方便,与antd中的Menu.Item中的icon属性的形式是一致的&#…

C++力扣Leetcode算法5--搜索

1.深度优先遍历(depth-first-search),遇到新节点就遍历下去。因此遍历需要用先入后出的栈来实现,也可以通过与栈等价的递归来实现。 深度优先搜索也可以用来检测环路:记录每个遍历过的节点的父节点,若一个节…

计算机组成原理【CO】Ch2 数据的表示和应用

文章目录 大纲2.1 数制与编码2.2 运算方法和运算电路2.3 浮点数的表示和运算 【※】带标志加法器OFSFZFCF计算机怎么区分有符号数无符号数? 【※】存储排列和数据类型转换数据类型大小数据类型转换 进位计数制进制转换2的次幂 各种码的基本特性无符号整数的表示和运算带符号整…

微信小程序Skyline模式下瀑布长列表优化成虚拟列表,解决内存问题

微信小程序长列表,渲染的越多就会导致内存吃的越多。特别是长列表的图片组件和广告组件。 为了解决内存问题,所以看了很多人的资料,都不太符合通用的解决方式,很多需要固定子组件高度,但是瀑布流是无法固定的&#xf…

推荐一款轻量级的hosts文件编辑器(免安装版)

在管理和编辑hosts文件时,一款简单而有效的工具是非常重要的。下面推荐一款免安装版的轻量级hosts文件编辑器,让你轻松管理你的hosts文件。 windows系统默认hosts文件位置 下载地址:https://www.alipan.com/s/8kSns9eAi9f

CSS aspect-ratio属性设置元素宽高比

aspect-ratio 是CSS的一个属性&#xff0c;用于设置元素的期望宽高比。它设置确保元素保持特定的比例&#xff0c;不受其内容或容器大小的影响。 语法&#xff1a; aspect-ratio: <ratio>;其中 <ratio> 是一个由斜杠&#xff08;/&#xff09;分隔的两个数字&…

代码随想录第39天 | 62.不同路径 、 63. 不同路径 II

一、前言 参考文献&#xff1a;代码随想录 今天主要的题目是动态规划的路径问题&#xff0c;动态规划五要点&#xff1b; 1、确定dp数组&#xff0c;dp[i]代表什么i代表什么&#xff1b; 2、递推公式&#xff1b; 3、初始化dp数组&#xff1b; 4、遍历顺序&#xff1b; …

Linux常用命令介绍

Linux ### 常用命令&#xff1a; 1、ls命令&#xff1a; 显示当前目录下文件和文件夹。 举例&#xff1a;在用户目录&#xff08;root&#xff09;使用ls可以查看用户里的文件及文件夹。 -l可以详细看列出文件及文件夹, ll命令等价与ls - l 2、cd命令 作用是切换目录。 …

uniapp APP真机调试接口请求不到服务器解决方法

项目场景&#xff1a; 在使用Hbuilder开发uniapp的过程中&#xff0c;出现了两个在 Chrome 调试中正常&#xff0c;但打包后异常的问题&#xff0c;特此记录。 问题描述 在 H5 端请求接口正常请求。 App 端 请求接口&#xff0c;提示 "{"errMsg":"reque…

百万成神-转自九边pro 的分享

1&#xff0c;如果一个人写代码写到10万行左右&#xff0c;也会出现下笔如有神的效果&#xff0c;很多时候自己都不知道自己怎么会想出这么复杂的套路和算法来。 2&#xff0c;我问过那个作者&#xff0c;他是怎么想到的&#xff0c;他说他也不知道&#xff0c;反正每天都写&am…

R语言数据可视化:基本绘图系统

目录 plot函数 par函数 hist函数 boxplot函数 plot函数应用实战 全局参数 R语言中有三大绘图系统包括基本绘图系统&#xff0c;Lattice绘图系统&#xff0c;ggplot2绘图系统 基本绘图系统 在R语言中&#xff0c;以下函数通常用于创建和定制图形&#xff1a; plot 函数…

网络通信三要素:IP、端口和协议

IP&#xff1a;设备在网络中的地址&#xff0c;是唯一的标识 IP&#xff1a;全程”互联网协议地址“&#xff0c;是分配给上网设备的唯一标志 IP地址有两种形式&#xff1a; IPv4&#xff1a;32位 IPv6&#xff1a;共128位。分成8段表示&#xff0c;每取四位编码成一个16进制…

分布式技术---------------消息队列中间件之 Kafka

目录 一、Kafka 概述 1.1为什么需要消息队列&#xff08;MQ&#xff09; 1.2使用消息队列的好处 1.2.1解耦 1.2.2可恢复性 1.2.3缓冲 1.2.4灵活性 & 峰值处理能力 1.2.5异步通信 1.3消息队列的两种模式 1.3.1点对点模式&#xff08;一对一&#xff0c;消费者主动…

【御控物联】 1、物联网介绍

文章目录 一、定义二、起源三、发展四、应用五、未来六、技术资料 一、定义 如何理解物联网&#xff0c;我们引用百度百科的一句话“把所有物品通过信息传感设备与互联网连接起来&#xff0c;进行信息交换&#xff0c;即物物相息&#xff0c;以实现智能化识别和管理”&#xf…

【数据结构】AVL树

AVL树 AVL树&#xff08;Adelson-Velsky和Landis树&#xff09;是一种自平衡二叉搜索树。它通过维护树的高度平衡来确保树的操作复杂度为O(log n)。它通过在每个节点上跟踪平衡因子来保持树的平衡。平衡因子是左子树和右子树高度之间的差值。 AVL树的特性 每个节点都有一个平…