JAVA 几种常见的设计模式

Myproduce_myproduce_生产者消费者问题_ 设计一程序,由一个进程创建三个子进程,三个子进程一个是生产者进程,两个是消费者进程,父子进程都使用父进程创建的共享存储区进行通信,由生产者进程将一个数组中的十个数值发送到由5个缓冲区组成的共享内存中,两个消费者进程轮流接收并输出这十个数值,同时将两个消费者进程读出的数值进行累加求各和。 立即下载
一、单例模式

单例设计模式简单说就是无论程序如何运行,采用单例设计模式的类永远只会有一个实例化对象产生。常见方法是将采用单例设计模式的类的构造方法私有化,并在其内部产生该类的实例化对象,并将其封装成private static类型,时定义一个静态方法返回该类的实例。

根据实例对象按需产生或是加载类时就产生可分为懒汉式和饿汉式

饿汉式:

public class SingleDemo {
	private SingleDemo(){}
	private static SingleDemo s=new SingleDemo();
	public static SingleDemo getInstance(){
		return s;
	}
}

懒汉式:两种方案

方案一

public class SingleDemo2 {

	private SingleDemo2(){};
	private static SingleDemo2 s=null;
	public SingleDemo2 getInstance(){
		if(s==null){
			synchronized (SingleDemo2.class) {
				if(s==null){
					s=new SingleDemo2();
				}
			}
		}
		return s;
	}
}
方案二

class Single1 {
	private Single1() {
	}

	// 定义私有的内部静态类 对外隐藏 ,外部类加载时内部类不会同时加载
	private static class SingleUtil {
		static Single1 single_new = new Single1();
	}

	public static Single1 getInstance() {
		// 此时有调用到内部类的静态方法,加载,实现了延迟加载的目的,同时类加载只加载一次,因此线程安全
		return SingleUtil.single_new;
	}
}

二、模板模式

模板模式中父类为抽象类,其中制定一个涵盖了实现逻辑的方法,并将部分逻辑以具体方法的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。
不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。
先制定一个顶级逻辑框架,而将逻辑的细节留给具体的子类去实现。
我的理解是父类方法向子类指明了实现一个方法的具体步骤,其中某个步骤可以由父类指明具体实现,有些步骤则必须有子类亲自去具体实现.

下面是一个模板模式的例子

public abstract class Produce {

	protected void make() {

		proNum();// 获取商品编号
		System.out.println("生产一产品主体");
		color();// 定制颜色
		pack();// 包装
	}

	protected abstract void proNum();

	protected abstract void color();

	protected abstract void pack();

}

class MyProduce extends Produce{

	@Override
	protected void proNum() {
		// TODO Auto-generated method stub
		System.out.println("赋予商品编号"+System.currentTimeMillis());
	}

	@Override
	protected void color() {
		// TODO Auto-generated method stub
		System.out.println("赋予商品红色");
	}

	@Override
	protected void pack() {
		// TODO Auto-generated method stub
		System.out.println("将产品使用环保纸盒包装");
	}
	
}
测试:

public class BlogTest {
	public static void main(String[] args) {
		MyProduce produce=new MyProduce();
		produce.make();
	}
}


三、装饰模式

当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能。那么自定义的该类称为装饰类。装饰类通常会通过构造方法接收被装饰的对象。并基于被装饰的对象的功能,提供更强的功能。

如:自定义字符输入流的包装类,通过这个包装类对底层字符输入流进行包装,让程序通过这个包装类读取某个文本文件(时,能够在读取的每行前面都加上有行号和冒号。

这时需要自定义一个MyFileReader,并传入一个FileReader类,生成自己想要的新功能新方法。

public class BlogTest{
	public static void main(String[] args) throws Exception {
		MyFileReader in = new MyFileReader(new FileReader(new File(
				"D:\\test4.txt")));
		String line;
		while ((line = in.readLine()) != null) {
			System.out.print(line);
		}
	}
}

class MyFileReader {
	private FileReader reader;
	private int lineNum;

	public int getLineNum() {
		return lineNum;
	}

	public void setLineNum(int lineNum) {
		this.lineNum = lineNum;
	}

	public MyFileReader(FileReader reader) {
		this.reader = reader;
	}

	private MyFileReader() {

	}

	public String readLine() throws Exception {
		lineNum++;
		StringBuffer buf = new StringBuffer();
		// buf.append(lineNum+":");
		int data = 0;

		while ((data = reader.read()) != -1) {
			if ('\n' == data)
				break;
			buf.append((char) data);
		}
		if (buf.length() == 0)
			return null;
		return lineNum + ":\t" + new String(buf.toString().getBytes("UTF-8"), "UTF-8");

	}
}

四、工厂模式

1.简单工厂模式(结合反射)


public abstract class Electronics {
	abstract void run();
}
public class PC extends Electronics {

	@Override
	void run() {
		// TODO Auto-generated method stub
		System.out.println("PC---Eclipse");
	}

}
public class Phone extends Electronics {

	@Override
	void run() {
		// TODO Auto-generated method stub
		System.out.println("phone---打电话");
	}

}
下面是一个工厂类,根据传入的ClassName反射生成一个实例

public class Factory {
	public static Object getInstance(String className) throws Exception{
		Class clazz=Class.forName(className);
		return clazz.newInstance();
	}
}
测试

public class MyTest {
	public static void main(String[] args) throws Exception {
		Electronics phone = (Electronics) Factory.getInstance(Phone.class.getName());
		phone.run();
		Electronics pc = (Electronics) Factory.getInstance(PC.class.getName());
		pc.run();
	}
}
结果:

phone---打电话
PC---Eclipse

2.工厂方法模式

interface Factory {
	public abstract Electronics getInstance();
}

class PhoneFactory implements Factory {

	@Override
	public Electronics getInstance() {
		// TODO Auto-generated method stub
		return new Phone();
	}

}

class PCFactory implements Factory {

	@Override
	public Electronics getInstance() {
		// TODO Auto-generated method stub
		return new PC();
	}

}
用户需要不同设备只需调用不同工厂

public class MyTest {
	public static void main(String[] args) throws Exception {
		Factory phoneFactory = new PhoneFactory();
		Electronics phone = phoneFactory.getInstance();
		Factory pcFactory = new PCFactory();
		Electronics pc = pcFactory.getInstance();
		phone.run();
		pc.run();
	}
}
3.抽象工厂模式

前面两种工厂模式在实际使用中较少,而抽象工厂模式在开发中最为常见,可以配合配置文件切换数据库等等。

如下面的例子,有Iphone和Galaxy实现Phone接口,MacBook和Laptop实现PC接口,AppleFactory和SamsungFactory继承Factory抽象类,AppleFactor只生产Iphone和MacBook,SamsungFactory只生产Galaxy和LapTop。现在要实现不改变程序代码的情况下,只对配置文件做修改达到切换工厂,以改变生产的产品的目的。

interface PC{
	void run();
}
interface Phone{
	void run();
}
public class Iphone implements Phone {

	@Override
	public void run() {
		// TODO Auto-generated method stub
		System.out.println("Iphone running....");
	}

}
public class Galaxy implements Phone {

	@Override
	public void run() {
		// TODO Auto-generated method stub
		System.out.println("三星Galaxy手机 running...");
	}

}
public class LapTop implements PC{

	@Override
	public void run() {
		// TODO Auto-generated method stub
		System.out.println("三星 PC running...");
	}

}
public class MacBook implements PC {

	@Override
	public void run() {
		// TODO Auto-generated method stub
		System.out.println("MacBook running...");
	}
	
}
下面是工厂类:

public abstract class Factory {
	abstract PC getPC();

	abstract Phone getPhone();

	static void getFactory() {

	};
}

class AppleFactory extends Factory {

	@Override
	public PC getPC() {
		// TODO Auto-generated method stub
		return new MacBook();
	}

	@Override
	public Phone getPhone() {
		// TODO Auto-generated method stub
		return new Iphone();
	}

}

class SamsungFactory extends Factory {

	@Override
	public PC getPC() {
		// TODO Auto-generated method stub
		return new LapTop();
	}

	@Override
	public Phone getPhone() {
		// TODO Auto-generated method stub
		return new Galaxy();
	}

}


测试:

public class MyTest {
	public static void main(String[] args) throws Exception {
			Factory factory=new AppleFactory();//此处建立苹果工厂
			Phone phone=factory.getPhone();
			PC pc=factory.getPC();
			phone.run();
			pc.run();	
	}
}
打印结果:

Iphone running....
MacBook running...


public class MyTest {
	public static void main(String[] args) throws Exception {
			Factory factory=new SamsungFactory();//此处建立苹果工厂
			Phone phone=factory.getPhone();
			PC pc=factory.getPC();
			phone.run();
			pc.run();	
	}
}
打印结果:

三星Galaxy手机 running...
三星 PC running...

以上实现了手动切换工厂实例,现在将Factory抽象类中加入静态方法getFactory()来读取配置文件

public abstract class Factory {
	abstract PC getPC();

	abstract Phone getPhone();

	static Factory getFactory() throws Exception {
		Properties properties = new Properties();
		properties.load(new FileReader(new File("d:\\properties.config")));
		String factory = properties.getProperty("factory");
		Class clazz = Class.forName(factory);
		return (Factory) clazz.newInstance();
	};
}
配置文件如下:

factory=factoryTest.SamsungFactory

测试:

public class MyTest {
	public static void main(String[] args) throws Exception {
			Factory factory=Factory.getFactory();
			Phone phone=factory.getPhone();
			PC pc=factory.getPC();
			phone.run();
			pc.run();	
	}
}
打印结果:

三星Galaxy手机 running...
三星 PC running...

更改配置文件:

factory=factoryTest.AppleFactory
打印结果:

Iphone running....
MacBook running...

如上实现了,不改变代码而且换工厂以获取不同对象的功能。在实际应用中,工厂调用者并知道phone接口和pc接口的具体实现,只是获取到实例的引用,实现了对不应该暴露给用户资源的隐藏。











<PLC><汇川>汇川PLC基于EtherCat协议使用转矩模式控制SV630N伺服驱动电机 本系列是关于PLC相关的博文,包括PLC编程、PLC与上位机通讯、PLC与下位驱动、仪器仪表等通讯、PLC指令解析等相关内容。PLC品牌包括但不限于西门子、三菱等国外品牌,汇川、信捷等国内品牌。除了PLC为主要内容外,PLC相关元器件如触摸屏(HMI)、交换机等工控产品,如果有值得记录的内容,也会添加进来。 阅读详情

相关推荐

在摩尔线程 MTT S80 上使用 Ollama 进行 DeepSeek R1 蒸馏版模型推理

本文主要介绍了如何在摩尔线程 MTT S80 上通过 Ollama 快速完成DeepSeek R1 蒸馏系列模型的推理。

摩尔线程blog中心 3602

Hadoop学习笔记—4.初识MapReduce

一、神马是高大上的MapReduce   MapReduce是Google的一项重要技术,它首先是一个编程模型,用以进行大数据量的计算。对于大数据量的计算,通常采用的处理手法就是并行计算。但对许多开发者来说,自己完完全全实现一个并行计算程序难度太大,而MapReduce就是一种简化并行计算的编程模型,它使得那些没有多有多少并行计算经验的开发人员也可以开发并行应用程序。这也就是MapReduc

deguotiantang的专栏 4826

【Claude Code】Claude Code 使用指南

本文介绍了AI编码助手Claude的基础和进阶操作指南。基础部分涵盖启动命令、模式切换(自动编辑/Plan/Yolo模式)、资源监控等核心功能,重点讲解了斜杠命令的使用方法。进阶操作详细说明了CLAUDE.md文件的创建与管理,包括项目规范、代码风格等内容的配置,以及如何通过该文件建立持久上下文。同时提醒了使用过程中的安全风险,建议通过配置文件限制AI对关键代码的访问权限。全文提供了完整的操作指引和安全建议,帮助开发者高效安全地使用Claude进行编码辅助。

大家好,我是敖云岚,一个沉迷代码的 “技术玩家”。擅长 Java、C++ 开发,对 MySQL、Redis、RabbitMQ 等技术也颇有研究。博客里既有硬核技术干货,也有诙谐幽默的编程日常分享。愿和你一起,笑着学技术,快乐敲代码! 1万+

Set的三种实现类

代码】Set的三种实现类。

qq_43244087的博客 1128

Avellaneda & Stoikov’s market-making strategy 工程化处理

前2篇文章详细介绍了AS存货模型的做市策略,这次对于这些公式里面一些希腊字母的取值是如何计算的,如何做工程化并应用到生产环境中做一些说明。这个里面有一些重要参数:很直观,可以直接取值的有:s = current market mid price (中间价,也就是【最佳卖价+最佳买价】/2)q = quantity of assets in inventory of base asset (也就是买入多少价值的股票数量)

weixin_42480337的博客 7070

一个响应ping包延迟偏大的问题

前段时间客户反馈一个使用pc上的命令行ping无线设备(WiFi4)时,设备平均响应时间(测试时长2小时,1秒Ping一次)相比其它机型偏慢的问题,并上传上具体的时间的Log.从log中看到,大多数包的响应还是比较快的,只是个别响应时间较长,且响应时间长的包时间几乎都是一样的100多ms.如下是部分响应时间截图. 整个2小时的测试时间里,总是时不时的出这么上102,104ms的响应时间,这直接导致了平均响应时间被拉大.于是本地测试,也发现了类似的延迟.本地测试时,现象略有...

流风回雪的博客 1万+

从set,get方法到设计模式在到Spring

从set,get方法到设计模式在到Spring

一日编程,永远编程 1848

Redis+QMT实战:如何用Stream模式实现聚宽策略的毫秒级跟单(附完整代码)

本文详细介绍了如何利用Redis Stream模式构建一个低延迟、高可靠的量化交易信号中继系统,实现从聚宽策略到本地QMT的毫秒级跟单。通过对比传统方案,解析了Redis Stream在消息持久化、消费组和显式确认方面的核心优势,并提供了完整的架构设计思路与核心代码实现,帮助量化开发者解决云端策略信号稳定传递至本地实盘的难题。

weixin_29280657的博客 477

java如何设计模块_java设计模式--模板方法模式

模板方法模式模拟场景:登录控制:现在有一个基于Web的企业级应用系统,需要实现两种登录控制(管理员登录和客户登录),直接使用不同的登录页面来区分它们。下面是基本的功能需求描述:普通客户登录前台的登录控制功能:(1)前台界面:用户能输入用户名和密码;提交登录请求,让系统进行登录控制。(2)后台:从数据库获取登录人员的信息。(3)后台:判断从前台传递过来的登录数据和数据库中已有的数据是否匹配。(4)前...

weixin_39668199的博客 364

健康保险费用预测:可解释机器学习在精算建模中的实战落地

健康保险费用预测是医疗AI与保险科技交叉领域的核心任务,本质是基于临床变量与社会因素对个体医疗支出进行风险量化。其技术原理需兼顾统计建模能力与监管可解释性,XGBoost+SHAP组合因支持特征归因、边际效应分析和临床可干预推演,成为保险精算场景的主流选择。该技术显著提升保费定价精度、降低偿付风险,并支撑DRG费用预警、团险核保辅助及再保险尾部风险评估等关键应用。本文聚焦真实产线中的时间序列验证、临床分层特征工程与监管红线指标(如Bias@90th、Calibration Slope),深入解析如何让模型不

weixin_33702545的博客 306

ABAP CDS SELECT, parameters 全面解析:把参数化视图玩明白(含可运行示例)

这篇技术博客介绍了ABAP CDS中参数化视图的用法与实践。文章从业务需求出发,解释了参数化视图的必要性,并详细说明了语法规则、参数类型匹配、视图内部参数引用等关键点。重点展示了在JOIN和ASSOCIATION中传递参数的写法,提供了航线分析的完整业务案例和可运行代码示例。文章还总结了视图实体与DDIC视图的差异、会话变量使用技巧等实践要点,特别强调了JOIN中必须显式传参的语法要求。通过真实场景演示,帮助开发者掌握参数化CDS的高效应用。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 364

java常见的几种设计模式

java常见的几种设计模式

snmkc_csdn的博客 8954

第八届传智杯WPS智能办公能力挑战赛练习题库

本文是关于WPS Office软件操作知识的选择题汇总,内容涵盖WPS文字、表格和演示三大组件的常用功能。主要包括:云文档协同编辑、文本框插入、幻灯片打印设置、数据排序与筛选、函数应用(如SUMIF、COUNT)、动画效果设置、格式刷使用、页眉页脚设置、单元格引用类型等基础操作要点。同时涉及计算机基础概念如二进制、ROM存储器等。题目以单选和多选形式呈现,附带详细答案解析,全面检验用户对WPS办公软件的功能掌握程度和实际操作能力,适用于办公软件技能培训和水平测试。

qq_73044452的博客 1434

JAVA中比较常见的几种设计模式

java常见的几种设计模式 作者:十八岁的夏天 侵删。

Hi逃的博客 299

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Java常见的几种设计模式

单例设计模式:一个类只允许创建一个对象(或者实例),那这个类就是一个单例类,这种设计模式就叫做单例设计模式

guanshengg的博客 1万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

(Java基础笔记log)Java中常见的几种设计模式详解

在 Java 编程里,设计模式是被反复使用、多数人知晓的、经过分类编目的代码设计经验总结。他能帮助开发者更高效地解决常见问题,提升代码的可维护性、可扩展性和复用性。下面介绍几种 Java 中常见的设计模式。

不积跬步,无以至千里;不积小流,无以成江河。 835

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

总结Java的几种常见设计模式

1.单例模式 单例模式存在的意义主要就是保证有且仅有一个对象,只创建一个,所有想要拿到该单例的都是同一个对象。 单例模式的好处: 1).由于单例模式在内存中只有一个实例,减少了内存开销。对于那些耗内存的类,只实例化一次,大大提高性能,尤其是移动开发中。 2).单例模式可以避免对资源的多重占用,例如一个写文件时,由于只有一个实例存在内存中,避免对同一个资源文件的同时写操作。 3).单例模式...

Healer_LU的博客 550

常见的几种Java设计模式

目录 1、什么是设计模式?设计模式有什么用? 2、设计模式应该遵循的面向对象设计原则 3、设计模式的六大原则 4、设计模式的四种类型(包括J2EE设计模式) 5、几种常见的设计模式 5.1、工厂模式 5.2、抽象工厂模式 5.3、单例模式 5.4、适配器模式 5.5、装饰器模式 5.6、代理模式 5.7、策略模式 5.8、观察者模式 1、什么是设计模式?设计模式有什么用...

weixin_41047704的博客 1480

Java中的设计模式,列举几种常见的设计模式并解释其应用场景

这些设计模式都是Java开发中常用的,它们可以帮助我们更好地组织代码,提高代码的可维护性和可扩展性。然而,设计模式并非银弹,应根据具体需求和场景来选择合适的设计模式。在Java中,设计模式是解决常见设计问题的最佳实践。它们可以帮助我们提高代码的可重用性、可维护性和可扩展性。Java中的设计模式,列举几种常见的设计模式并解释其应用场景。

Layla_c的博客 811

Java中有哪几种常见的设计模式

Java中一般认为有23种设计模式,分别是: 1.创建型模式,五种:工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式; 2.结构性模式,七种: ...

ITJingYing2050的博客 4635

【Java常见的几种设计模式】

简述Java常见的几种设计模式

zhijingege的博客 395

JAVA基础篇--常见的几种设计模式及其应用

设计模式(Design Pattern)是软件开发中总结出的可复用、可扩展、易维护的代码结构方案,能有效提高系统的可读性和可维护性。

m0_74168976的博客 698

java中几种常见的设计模式

1.单例模式(有的书上说叫单态模式其实都一样) 该模式主要目的是使内存中保持1个对象。看下面的例子: package org.sp.singleton; //方法一 public class Singleton { //将自身的实例对象设置为一个属性,并加上Static和final修饰符 private static final Singleton instance = new Sin

zgrjkflmkyc的专栏 1070
上一篇: JAVA String及基本数据类型包装类
下一篇: JAVA 解析XML
SetO2
博客等级 码龄12年 5粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值