java设计模式的几种体现方式

2023-05-16

1.单例模型

有时候在我的设计中,所有的类只共享一个实例,那么这时候就需要设计一个单实例的类。

思路是将这个类构造器私有化,这样外部就无法直接创建对象,然后提供公有的静态方法,让外部去调用。具体的实现方式有四种方式

方式一:饿汉模式

public class Singleton {
    // 创建本类的私有构造方法
    private Singleton(){}
    private static Singleton singleton = new Singleton();
    public static Singleton getInstance(){
        return singleton;
    }
}

饿汉模式在类加载是就已经创建了类对象,不管是否使用该类的实例,它已经在堆内存里。

直接将该类的实例对象作为属性实现的

方式二:懒汉模式

 public static LazySingleton getInstance(){
        if(singleton == null){
            synchronized (LazySingleton.class){
                if(singleton == null){
                    singleton = new LazySingleton();
                }
            }
        }
        return singleton;
    }

之所以成为懒汉模式,是相对于饿汉模式说,因为饿汉模式是你不管是不是使用这个类,都会产生这个类的实例,而懒汉模式是在getInstance()这个方法里面new出来的,所以只有调用这个方法,才会在堆内存种产生类实例。

通过双重检测 和 同步代码块synchronized{} 使得代码执行的高效和线程安全

方式三:通过枚举

public class EnumSingleton {
    private EnumSingleton(){}
    private static enum SinEnum{
        // 自定义的枚举值 如果没有该自定义枚举值 无法获取枚举对象
        TEST;
        private EnumSingleton es = new EnumSingleton();
    }

    public static EnumSingleton getInstance(){
        SinEnum sinEnum = SinEnum.TEST;
        return sinEnum.es;
    }
}

方式四:匿名内部内

/**
 * 通过静态内部类 完成单例模式的创建
 * 在外部类加载时,并不会加载内部类,也就是不会执行new 实例(),这属于懒加载
 * 只有第一次调用getInstance方法时,才会加载
 */
public class InnerSingleton {
    private InnerSingleton(){}
    // 静态内部类
    private static class Inner{
        private static InnerSingleton instance = new InnerSingleton();
    }

    public static InnerSingleton getInstance(){
        return Inner.instance;
    }

}

2.代理模式

把核心的业务抽象成一个接口,然后让被代理者抽象成一类去实现这个接口,代理者也抽象成一个类去实现这个接口,然后将被代理者类实例在代理者类中设计成为它的一个属性,然后代理者类就可以在实现的方法中,使用被代理的核心业务方法,同时可以加上一些非核心的业务。

请想像这样一个场景:你是一个租客,你需要租房子,那么你回去找房产中介帮你完成你的需求(租房子),

所以可以将租房子业务抽象成一个接口

public interface RentRoom {
    //核心业务:租房子
    public void rent();
}

 租客类去实现这个接口

 

//租客
public class Renter implements RentRoom{
    public void rent() {
        System.out.println("租房子");

    }
}

 

 中介类中也去实现租房的业务接口,把租客类实例作为自己的属性,因此可以直接使用租客类的核心业务方法,同时也可以加上一些非核心的业务逻辑,这样就可以让中介类完成租房子的业务。也就是通过调用中介类实例的renter方法

//房产中介
public class Agency implements RentRoom {
    private Renter renter =  new Renter();
    public void rent() {
        System.out.println("找房子");//这个是非核心业务,中介干的活
        renter.rent(); //这个是核心业务
    }
 
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java设计模式的几种体现方式 的相关文章

随机推荐

  • SpringBoot+LayUI+MybatisPlus 前后端分离 实现排名统计功能

    前言 xff1a 小伙伴们 xff0c 大家好 xff0c 我是狂奔 蜗牛rz xff0c 当然你们可以叫我蜗牛君 xff0c 我是一个学习Java快一年时间的小菜鸟 xff0c 同时还有一个伟大的梦想 xff0c 那就是有朝一日 xff0
  • iphone恢复模式_如何阻止iPhone的人像模式制作多个文件

    iphone恢复模式 The iPhone 7 Plus Portrait Mode is really awesome In the right circumstances it makes it possible to take por
  • SpringBoot+LayUI+MybatisPlus 前后端分离 实现数据表格下拉框功能

    前言 xff1a 小伙伴们 xff0c 大家好 xff0c 我是狂奔 蜗牛rz xff0c 当然你们可以叫我蜗牛君 xff0c 我是一个学习Java快一年时间的小菜鸟 xff0c 同时还有一个伟大的梦想 xff0c 那就是有朝一日 xff0
  • Linux网络配置

    目录 1 查看网络配置 1 1ifconfig命令 查看网络接口信息 1 2 hostname 查看主机名称 1 2 1查看主机名 1 2 2修改主机名称 1 3route 查看路由表条目 1 4 netstat 查看网络连接情况 1 5
  • KVM virt-manager 启动不了 cannot open display,和中文乱码

    首先启动不了 如下情况 xff0c 启动不了 先重启虚拟机 span class token punctuation span root 64 kvm1 span class token operator span span class t
  • python使用request+xpath爬取豆瓣电影数据

    python使用request 43 xpath爬取豆瓣电影 背景话不多说上代码 背景 由于毕设需要用到电影相关的数据 xff0c 在网上想查找一个可以爬电影的教程 xff0c 但是基本上所有的教程都是爬的豆瓣top250 xff0c 并没
  • IDEA mvn阿里云镜像设置 保姆级教程

    设置 打开 文件 设置 搜索mvn 修改用户设置文件 和 本地仓库 路径为自己喜欢的目录下 以下为我此处的文件 新项目设置 xff08 创建新项目默认设置 xff09 打开 文件 新项目设置 新项目的设置 把刚才的设置设置一遍 文件 地址
  • 解压码

    BN00001 22kke BN00002 88cde BN00003 00ike BN00004 76cdb BN00005 09dbm BN00006 0mndc BN00007 cd78d BN00008 bdmf8 BN00009
  • 保险项目业务流程

    1 整个项目分为四分模块 xff1a 信息采集模块 信息验证 审批 生成合同 xff08 开单 xff09 信息采集模块 xff1a 包括购买保险产品 xff0c 客户个人信息 1 纸质文档给客户填写 xff0c 在回来录入系统 2 客户直
  • IDEA使用maven自定义archetype

    标题自定义archetype 在pom文件中添加archetype plugin span class token generics span class token punctuation lt span plugin span clas
  • 自定义Perperties文件内容读取

    新建properties文件放在resources目录下 properties文件内容 url span class token operator 61 span jdbc span class token operator span my
  • 使用CSS中的Hover控制显示子元素或者兄弟元素

    lt DOCTYPE html gt lt html lang 61 34 en 34 gt lt head gt lt meta charset 61 34 UTF 8 34 gt lt meta name 61 34 viewport
  • iphone表情显示问号_如何在iPhone上搜索特定的表情符号

    iphone表情显示问号 Most of us use emoji on our iPhone but until recently finding the right one has been tricky Luckily startin
  • maven项目中的jdbc连接步骤

    在maven项目pom xml中到入驱动包 xff08 以下是驱动包代码 xff09 lt dependencies gt lt https mvnrepository com artifact mysql mysql connector
  • executeUpdate()与executeQuery()的使用

    增 删 改 用executeUpdate xff08 xff09 返回值为int型 xff0c 表示被影响的行数 例子 查用executeQuery 返回的是一个集合 next xff08 xff09 表示 指针先下一行 xff0c 还有f
  • Access denied for user ''@'localhost' (using password: YES)错误解决方法

    远程登录被拒绝 xff0c 要改一个表数据的属性让他可以远程登录 解决方法如下 xff0c 执行命令 xff1a mysql gt use mysql mysql gt select host user from user 查看结果是不是r
  • leetcode部分数据库+sqlzoo练习题

    175 组合两个表 SQL架构 表1 Person 43 43 43 列名 类型 43 43 43 PersonId int FirstName varchar LastName varchar 43 43 43 PersonId 是上表主
  • ubuntu下手动安装gnome插件

    ubuntu下手动安装gnome插件 span class token comment 下载环境 span sudo apt span class token operator span span class token keyword g
  • 类和对象的理解

    类和对象的关系 是java中两个重要的概念 xff0c 简单一句话将就是 xff1a 类是对象的模板 xff0c 对象是类的实例 比如 xff1a 设计车的图纸是类 xff0c 然后比亚迪 本田 奔驰这些车 xff08 对象 xff09 都
  • java设计模式的几种体现方式

    1 单例模型 有时候在我的设计中 xff0c 所有的类只共享一个实例 xff0c 那么这时候就需要设计一个单实例的类 思路是将这个类构造器私有化 xff0c 这样外部就无法直接创建对象 xff0c 然后提供公有的静态方法 xff0c 让外部