首页 > 其他分享 >【设计模式】单例模式——单例模式变体之“多例模式”

【设计模式】单例模式——单例模式变体之“多例模式”

时间:2024-01-07 19:32:23浏览次数:21  
标签:模式 className static private 单例 Multition 设计模式 ioc

所谓“多例模式”并不在GoF的23种设计模式之内,是单例模式中的一种特例,在很多资料中也被称为单例模式的容器式实现。“多例模式”可以理解为在一定数量范围内创建类的多个实例(简称“说法一”);还有一层理解就是不同类型的对象可以创建多个,但相同类型的对象只能创建一个(简称“说法二”)。

说法一

先看代码:

public class Multition {
    private Multition() {}
    private static final int COUNT = 5;
    private static Map<String,Object> ioc = new ConcurrentHashMap<String,Object>();

    static {
        for (int i = 0; i < COUNT; i++) {
            ioc.put(""+i,new Multition());
        }
    }
    public static Object getInstance(String name){
        synchronized (ioc){
            return ioc.get(name);
        }
    }
}

这种写法提供了一种灵活、可控制实例数量的解决方案。我们可以通过合理使用多例模式避免资源的浪费,提高系统的性能和可扩展性。但是需要注意,多例模式的设计需要根据具体情况进行调整,确保在不同场景下创建适当数量的实例。

说法二

先看代码:

public class Multition {
    private Multition() {}
    private static Map<String,Object> ioc = new ConcurrentHashMap<String,Object>();
    public static Object getInstance(String className){
        synchronized (ioc){
            if (!ioc.containsKey(className)){
                Object obj = null;
                try{
                    obj = Class.forName(className).getNestHost();
                    ioc.put(className,obj);
                }catch (Exception e){
                    e.printStackTrace();
                }
                return obj;
            }
            return ioc.get(className);
        }
    }
}

这种写法适用于需要大量创建单例对象的场景,便于管理,但因为用到了反射,所以对性能有一定的影响。

标签:模式,className,static,private,单例,Multition,设计模式,ioc
From: https://blog.51cto.com/dongfeng9ge/9134506

相关文章

  • 网易美术【抢单模式】卷出新境界?
    东窗事发24年1月5号,网易美术爆出了抢单积分制度。爆料称抢单积分与年终奖挂钩,实行积分末尾淘汰。消息一出整个互联网都为之一震!随后,脉脉的网易同事圈炸开了锅。有网友戏称美术设计成外卖员了,还得抢单。伴随着该制度的出台,网易相应也进行了人员架构的调整。上班正常干活, 下班抢单......
  • 程序员必知!享元模式的实战应用与案例分析
    享元模式是一种减少相似对象创建和销毁的设计模式,通过将对象状态分为不变和可变部分,实现内存节省和性能提升。例如,在线游戏中大量玩家角色可共享相同的不变属性,而每人特有的可变属性则单独存储,享元模式使用享元类存储不变属性,非享元类存储可变属性,并通过享元工厂管理对象的复用和......
  • 【设计模式】单例模式——单例模式的懒汉式和DCL式实现
    懒汉式为了解决饿汉式单例带来的内存浪费问题,出现了懒汉式单例的写法,代码如下:publicclassSingleton{privatestaticSingletoninstance=null;privateSingleton(){}publicstaticSingletongetInstance(){if(instance==null){insta......
  • 设计模式Java实战,彻底学会
    这是全网最强的Java设计模式实战教程。此教程用实际项目场景,结合SpringBoot,让你真正掌握设计模式。网址是:Java设计模式实战专栏介绍-自学精灵(也可以百度搜索“自学精灵”)。本设计模式专栏的威力用Java实战来介绍常用的设计模式,让你真正掌握设计模式。用项目实际场景进行设计模式......
  • Django中的URL模式
    Django中的URL模式是一种用于处理HTTP请求和将请求映射到相应的视图函数的技术。URL模式是Django路由系统的基础,它负责接收客户端发送的请求,并将其映射到相应的视图函数进行处理。URL模式的核心功能是URL匹配和视图函数的调用。URL模式底层逻辑主要包括以下几个方面:URL模式类:Django......
  • 使用Apache Commons Chain实现命令模式
    第1章:引言大家好,我是小黑。今天咱们来聊聊一个挺有意思的话题:如何用ApacheCommonsChain实现命令模式。首先,得先搞明白什么是命令模式,对吧?命令模式,它其实是一种设计模式,主要用来把一个请求或者操作封装成一个对象。这样做的好处是什么呢?主要是让你的软件设计更加灵活,更容易扩展......
  • rabbitmq的五种模式
    第一种:简单模式Simple       一个消费者消费一个队列 第二种:工作模式Work        多个消费者消费一个队列 第三种:发布订阅模式             X代表交换机消息产生者将消息放入交换机,交换机发布订阅把消息......
  • 【设计模式】单例模式——利用ThreadLocal或CAS实现单线程内部的单例模式
    很多时候我们并不需要一个类创建的对象是全局唯一的,只需要保证在单个线程内是唯一的、线程安全的就可以。为了实现单线程内部的单例,我们可以用ThreadLocal或CAS实现。利用ThreadLocal实现先看代码:publicclassThreadLocalSingleton{privatestaticfinalThreadLocal<Thread......
  • 代理模式
    动态代理核心代码/***@Author:jishaleng*/publicclassProxyInvocationHandlerimplementsInvocationHandler{//目标对象/委托对象privateObjecttarget;publicProxyInvocationHandler(Objecttarget){this.target=target;}......
  • 《PySpark大数据分析实战》-07.Spark本地模式安装
    ......