java基础之设计模式(单例模式,工厂模式)

设计模式

是一种编码套路

单例模式

一个类只能创建一个实例

饿汉式

直接创建唯一实例

package com.by.entity;
​
/*** 单例模式-饿汉式*/
public class ClassA {//static: 1. newClassA可以访问返回 2. 静态属性内存中只会存在一个//private: 防止外界直接访问属性private static ClassA ca = new ClassA();
​//外界获取唯一实例的渠道//static:使外界直接通过类名访问public static ClassA newClassA(){return ca;}
​//构造私有化-防止外界调用构造创建对象private ClassA(){
​}
}

缺点: 有可能浪费空间

懒汉式

在获取实例是创建唯一对象

package com.by.entity;
​
/*** 单例模式-懒汉式*/
public class ClassB {//static: 1. newClassA可以访问返回 2. 静态属性内存中只会存在一个//private: 防止外界直接访问属性private static ClassB cb = null;
​//外界获取唯一实例的渠道//static:使外界直接通过类名访问//synchronized: 同步方法  预防线程安全问题public static synchronized ClassB newClassB(){if (cb == null) {//当第一次获取时再进行实例化 cb = new ClassB();}return cb;}
​//构造私有化-防止外界调用构造创建对象private ClassB(){
​}
​
}

缺点: 线程效率慢

懒汉式-进阶版

在懒汉式的基础上,利用同步代码块结合二次校验提高执行效率

package com.by.entity;
​
/*** 单例模式-懒汉式进阶版*/
public class ClassC {//static: 1. newClassA可以访问返回 2. 静态属性内存中只会存在一个//private: 防止外界直接访问属性private static ClassC cc = null;
​//外界获取唯一实例的渠道//static:使外界直接通过类名访问public static ClassC newClassC(){if (cc == null) {//二次校验: 决定是否需要开启互斥锁 t1:true  t2:truesynchronized (ClassC.class) {//临界资源对象: 当前类的类对象//对属性进行实例化if (cc == null) {//当第一次获取时再进行实例化cc = new ClassC();}}}return cc;}
​//构造私有化-防止外界调用构造创建对象private ClassC(){
​}
​
}package com.by.entity;
​
/*** 单例模式-懒汉式进阶版*/
public class ClassC {//static: 1. newClassA可以访问返回 2. 静态属性内存中只会存在一个//private: 防止外界直接访问属性private static ClassC cc = null;
​//外界获取唯一实例的渠道//static:使外界直接通过类名访问public static ClassC newClassC(){if (cc == null) {//二次校验: 决定是否需要开启互斥锁 t1:true  t2:truesynchronized (ClassC.class) {//临界资源对象: 当前类的类对象//对属性进行实例化if (cc == null) {//当第一次获取时再进行实例化cc = new ClassC();}}}return cc;}
​//构造私有化-防止外界调用构造创建对象private ClassC(){
​}
​
}

工厂模式

  • 是一种底层技术,通常用于底层框架的编写

  • 思路: 将数据的创建和维护交由工厂完成

案例
  • 需求: 构建一个工厂类,获取学生对象

  1. 提供学生类

    package com.by.entity;
    ​
    public class Student {private String name;private int age;private double score;
    ​public String getName() {return name;}
    ​public void setName(String name) {this.name = name;}
    ​public int getAge() {return age;}
    ​public void setAge(int age) {this.age = age;}
    ​public double getScore() {return score;}
    ​public void setScore(double score) {this.score = score;}
    ​@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +", score=" + score +'}';}
    ​public Student() {}
    ​public Student(String name, int age, double score) {//string,int,doublethis.name = name;this.age = age;this.score = score;}
    }

  2. 书写配置文件

    • 在项目下创建后缀名为.properties的配置文件

    • 作用: 存放被管理类的全限定名

    • 键=值的形式存放数据

    • 键值不可添加双引号、末尾不可添加分号、中间不可存在多个符号(如空格)

    • 一行只能有一个键值对

    StudentClassName=com.by.entity.Student
    
  3. 书写工厂类

    package com.by.util;
    ​
    import com.by.entity.Student;
    ​
    import java.io.FileInputStream;
    import java.util.Properties;
    ​
    public class MyFactory {/*** 获取学生对象*/public static Student getStudent(){Student student = null;try (//创建输入流FileInputStream fis=new FileInputStream("factory.properties")) {//将配置文件的内容加载到集合中Properties p = new Properties();p.load(fis);//获取全限定名String className = p.getProperty("StudentClassName");//获取类对象Class c = Class.forName(className);//利用反射构建学生实例student = (Student) c.newInstance();} catch (Exception e) {System.out.println("未知异常!");e.printStackTrace();}return student;
    ​}
    }
    ​

  4. 测试

    package com.by.test;
    ​
    import com.by.entity.Student;
    import com.by.util.MyFactory;
    ​
    public class Test5 {public static void main(String[] args) {//利用工厂获取学生实例对象Student s1 = MyFactory.getStudent();Student s2 = MyFactory.getStudent();
    ​}
    }
    ​

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

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

相关文章

redis总结--常见问题与解决办法,推荐等级

因为csdn只支持这种文档形式:不支持思维导图: 更好友好的阅读:可以看我的飞书--------思维导图(这样食用更加): 缓存穿透问题原因每次从缓存中都查不到数据,而需要查询数据库,同时数…

Kafka-消费者-KafkaConsumer分析-ConsumerCoordinator

在前面介绍了Kafka中Rebalance操作的相关方案和原理。 在KafkaConsumer中通过ConsumerCoordinator组件实现与服务端的GroupCoordinator的交互,ConsumerCoordinator继承了AbstractCoordinator抽象类。 下面我们先来介绍AbstractCoordinator的核心字段,如…

GO——与PHP的并发对比

背景 go比php可支持的并发数更高,为什么 目标 分析点: 系统的并发瓶颈go语言的并发瓶颈php语言的并发瓶颈 系统并发 参考:https://juejin.cn/post/6844904025553534990 提到并发,我们这里指的是web服务web系统的第一层&…

如何在Linux上安装Stable Diffusion WebUI

Stable Diffusion WebUI是一个基于AUTOMATIC1111的stable-diffusion-webui仓库的项目,允许用户通过web界面轻松地生成AI驱动的图像。本文将指导您在Linux系统上完成Stable Diffusion WebUI的安装过程。 准备工作 在安装Stable Diffusion WebUI之前,请确…

Apache JMeter 3.1压力测试监控服务器数据(cpu、内存、磁盘io等)

Apache JMeter 3.1压力测试 Apache JMeter 3.1压力测试监控cpu、内存情况1.下载Apache JMeter 3.11.1 添加线程组1.2 添加http请求1.3 增加http请求头设置1.4 添加csv配置1.5 添加测试结果监控配置 2. 监控插件下载3. 服务端插件下载并启动3.1 下载3.2 解压并启动3.3 增加服务器…

渗透测试之Kali如何利用CVE-2019-0708漏洞渗透Win7

环境: 1.攻击者IP:192.168.1.10 系统: KALI2022(vmware 16.0) 2.靶机IP:192.168.1.8 系统:Windows 7 6.1.7601 Service Pack 1 Build 7601 已开启远程协助RDP服务开启了3389端口 问题描述: KALI 如何利用CVE-2019-0708漏洞渗透Win7 解决方案: 1.打开kali,msf搜索…

最新React面试题:说说对React的理解?有哪些特性?

最新React面试题:说说对React的理解?有哪些特性? 回答思路:是什么?---》特性---》优势是什么?特性声明式编程Component组件的特点 优势 回答思路:是什么?—》特性—》优势 是什么&a…

【每周AI简讯】GPT-5将有指数级提升,GPT Store正式上线

AI7 - Chat中文版最强人工智能 OpenAI的CEO奥特曼表示GPT-5将有指数级提升 GPT奥特曼参加Y-Combinator W24启动会上表示,我们已经非常接近AGI。GPT-5将具有更好的推理能力、更高的准确性和视频支持。 GPT Store正式上线 OpenAI正式推出GPT store,目前…

​一套uni-app + .net医院线上预约挂号系统源码(公众号+小程序预约挂号)

线上预约挂号系统构建了医院和患者的连接,通过改善患者院内的就医服务流程,以微信公众号、支付宝小程序为患者服务入口,为居民提供导诊、预约、支付、报告查询等线上线下一体化的就医服务,缩短患者就诊环节,提高医疗机…

springboot第50集:File类,IO流,网络编程,反射机制周刊

image.png FileReader、FileWriter的使用 FileInputStream、FileOutputStream的使用 image.png image.png image.png image.png image.png image.png image.png image.png image.png image.png image.png image.png 服务器内存优化是一个复杂的过程,通常需要综合考虑…

09前后端分离+SSM整合的小案例

前端的Node 后端的Tomcat,是前端程序的容器。前端的npm 后端的maven 1. 导入前端项目 node版本:16.16.0 配置阿里镜像 npm config set registry https://registry.npmjs.org/ 更新npm版本 npm install -g npm9.6.6 用vscode打开解压后的项目 , 右上角…

Scrum.org认证PSM官方认证班Professional Scrum Master™ (PSM)

课程简介 Scrum是目前运用最为广泛的敏捷开发方法,是一个轻量级的项目管理和产品研发管理框架,旨在最短时间内交付最大价值。根据2022年全球敏捷状态报告,Scrum的应用占比已经达到87%。 Scrum.org 由 Scrum 的联合创始人 Ken Schwaber 创立…

三、Redis命令

一、Redis客户端 Redis是一个客户端和服务器结构的程序,Redis的客户端有很多种形态 通过以下的方法实现Redis客户端和服务器交互,必须先进入Redis-cli客户端程序,才能输入Redis命令。 1、自带了命令行客户端 redis-cli //连接本地 redis-…

jQuery的选择器

目录 基本过滤选择器 层次选择器 简单过滤选择器 内容过滤选择器 可见性过滤器 子元素过滤器 表单对象属性顾虑器 表单选择器 jQuery的选择器分类都有哪些? 根据所获取页面中元素的不同,可以将jQuery选择器分为四大类:基本选择器…

深入了解 Pytest Markers:提升测试用例的组织和控制能力

​从这篇开始,逐一解决fixture是啥?mark是啥?参数request是啥?钩子函数是啥?parametrize参数化是啥?这些问题。本片先介绍一下mark是啥?以及如何使用 Markers有啥用? 当使用 Pytest…

ZooKeeper 实战(五) Curator实现分布式锁

文章目录 ZooKeeper 实战(五) Curator实现分布式锁1.简介1.1.分布式锁概念1.2.Curator 分布式锁的实现方式1.3.分布式锁接口 2.准备工作3.分布式可重入锁3.1.锁对象3.2.非重入式抢占锁测试代码输出日志 3.3.重入式抢占锁测试代码输出日志 4.分布式非可重入锁4.1.锁对象4.2.重入…

SAP PI之Rest adapter

一,简介 REST风格接口是以http为传输协议,以xml或json或text为有效负载。下图展示了REST到XI再返回的一个过程,一个REST接口包含的信息有:服务URL、URL中带的参数、http方法(post/get/put等)、http头部、body部分的有效载荷。而X…

Sentinel限流、熔断

1、限流 单个服务节点限流 sentinel 提供了两种不同的隔离机制:信号量隔离和线程池隔离,它们的主要区别如下: 信号量隔离(Semaphore Isolation): 原理:信号量隔离基于计数器(或称令…

React Hooks大全—useContext

在本文中,我们将重点介绍useContext这个Hook,它可以让你在函数组件中轻松地访问React Context,从而实现跨组件的状态共享。我们将从基本使用,实现原理,最佳实践,以及一些常见的问题和解决方案来探讨useCont…

域名群站开源系统分享开源域名授权系统

一、需要自己安装PHP和MYSQL服务器环境。 二、务必设置伪静态规则,否则将无法访问文章栏目页面。 三、启用伪静态功能,请在站点设置中选择使用thinkphp的伪静态规则。 四、在域名的根目录下找到”data/config.php”文件,填入数据库的账号和…