单例模式和多例模式的总结

2024-08-29 10:08
文章标签 总结 模式 单例 多例

本文主要是介绍单例模式和多例模式的总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

学习交流关注微信公众号:钟渊博客

今天开始学习设计模式之单例和多例

单例模式的关键有两点:

1.构造方法为私有,这样外界就不能随意调用。

2.get的方法为静态,由类直接调用

 

多例模式(Multiton)

1 、多例类可以有多个实例 
2 、多例类必须能够自我创建并管理自己的实例,并向外界提供自己的实例。

 

一、单例模式和多例模式说明:

1.         单例模式和多例模式属于对象模式。

2.         单例模式的对象在整个系统中只有一份,多例模式可以有多个实例。

3.         它们都不对外提供构造方法,即构造方法都为私有。

4.         单例模式和多例模式的结构图如下所示:

    

单例多例模式

单例模式的三种形式:

第一种形式:懒汉式

 

public class SingletonClass{

    private static SingletonClass instance=null;

    public static synchronized SingletonClass getInstance()

    {

        if(instance==null)

        {

               instance=new SingletonClass();

        }

        return instance;

    }

    private SingletonClass(){

    }

}

第二种形式:饿汉式

 

 

 

 

//对第一行static的一些解释

// java允许我们在一个类里面定义静态类。比如内部类(nested class)。

//把nested class封闭起来的类叫外部类。

//在java中,我们不能用static修饰顶级类(top level class)。

//只有内部类可以为static。

public class Singleton{

    //在自己内部定义自己的一个实例,只供内部调用

    private static final Singleton instance = new Singleton();

    private Singleton(){

        //do something

    }

    //这里提供了一个供外部访问本class的静态方法,可以直接访问

    public static Singleton getInstance(){

        return instance;

    }

}

第三种形式: 双重锁的形式

 

 

 

 

public class Singleton{

    private static Singleton instance=null;

    private Singleton(){

        //do something

    }

    public static Singleton getInstance(){

        if(instance==null){

            synchronized(Singleton.class){

                if(instance==null)

{

   

  instance=new Singleton();

                }

            }

        }

        return instance;

    }

}

 

 

二、应用举例

1.         单例模式举例:

package com.solid.pattern;

 

import java.util.Locale;

import java.util.ResourceBundle;

 

/**

 * 单例模式

 * @author solid

 *

 */

public class Singleton {

 

    private static Singleton singleton = new Singleton();

   

    private Singleton() {}

   

    public static Singleton getInstance() {

       return singleton;

    }

   

    /**

     * 获取配置文件的值

     * @param key

     */

    public void getMessage(String key) {

       Locale locale = new Locale(key);

       ResourceBundle res = ResourceBundle.getBundle("res_zh_CN");

       String message = res.getString(key);

       System.out.println(message);

    }

}

 

package com.solid.pattern;

/**

 * 单例模式测试

 * @author solid

 *

 */

public class TestSingleton {

 

    private static Singleton singleton;

   

    public static void main(String[] args) {

       singleton = Singleton.getInstance();

       singleton.getMessage("title");

    }

}

 

2.         多例模式举例:

package com.solid.pattern;

/**

 * 多例模式

 * @author solid

 *

 */

public class Multiton {

 

    private static Multiton multi1 = new Multiton();

    private static Multiton multi2 = new Multiton();

   

    private Multiton() {}

   

    public static Multiton getInstance(int key) {

       if(key == 1) {

           return multi1;

       } else {

           return multi2;

       }

    }

   

    /**

     * 获取1—6之间的随机数

     */

    public void getValue() {

       int value = (int)(Math.random()*6+1);

       System.out.println(value);

    }

}

 

package com.solid.pattern;

/**

 * 多例模式测试

 * @author solid

 *

 */

public class TestMultiton {

    private static Multiton multi1;

    private static Multiton multi2;

    public static void main(String[] args) {

       multi1 = Multiton.getInstance(1);

       multi2 = Multiton.getInstance(2);

      

       multi1.getValue();

       multi2.getValue();

    }

}

 单例和多例的详细描述:

1. 什么是单例多例:
所谓单例就是所有的请求都用一个对象来处理,比如我们常用的service和dao层的对象通常都是单例的,而多例则指每个请求用一个新的对象来处理,比如action; 
2. 如何产生单例多例:
    在通用的SSH中,单例在spring中是默认的,如果要产生多例,则在配置文件的bean中添加scope="prototype"; 
3. 为什么用单例多例:
    之所以用单例,是因为没必要每个请求都新建一个对象,这样子既浪费CPU又浪费内存;
   之所以用多例,是为了防止并发问题;即一个请求改变了对象的状态,此时对象又处理另一个请求,而之前请求对对象状态的改变导致了对象对另一个请求做了错误的处理;
    用单例和多例的标准只有一个:
    当对象含有可改变的状态时(更精确的说就是在实际应用中该状态会改变),则多例,否则单例;
4. 何时用单例?何时用多例?
    对于struts2来说,action必须用多例,因为action本身含有请求参数的值,即可改变的状态;
  而对于STRUTS1来说,action则可用单例,因为请求参数的值是放在actionForm中,而非action中的;
   另外要说一下,并不是说service或dao一定是单例,标准同第3点所讲的,就曾见过有的service中也包含了可改变的状态,同时执行方法也依赖该状态,但一样用的单例,这样就会出现隐藏的BUG,而并发的BUG通常很难重现和查找;

这篇关于单例模式和多例模式的总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1117561

相关文章

C#和Unity中的中介者模式使用方式

《C#和Unity中的中介者模式使用方式》中介者模式通过中介者封装对象交互,降低耦合度,集中控制逻辑,适用于复杂系统组件交互场景,C#中可用事件、委托或MediatR实现,提升可维护性与灵活性... 目录C#中的中介者模式详解一、中介者模式的基本概念1. 定义2. 组成要素3. 模式结构二、中介者模式的特点

在Java中实现线程之间的数据共享的几种方式总结

《在Java中实现线程之间的数据共享的几种方式总结》在Java中实现线程间数据共享是并发编程的核心需求,但需要谨慎处理同步问题以避免竞态条件,本文通过代码示例给大家介绍了几种主要实现方式及其最佳实践,... 目录1. 共享变量与同步机制2. 轻量级通信机制3. 线程安全容器4. 线程局部变量(ThreadL

Spring Boot 与微服务入门实战详细总结

《SpringBoot与微服务入门实战详细总结》本文讲解SpringBoot框架的核心特性如快速构建、自动配置、零XML与微服务架构的定义、演进及优缺点,涵盖开发环境准备和HelloWorld实战... 目录一、Spring Boot 核心概述二、微服务架构详解1. 微服务的定义与演进2. 微服务的优缺点三

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys

Java设计模式---迭代器模式(Iterator)解读

《Java设计模式---迭代器模式(Iterator)解读》:本文主要介绍Java设计模式---迭代器模式(Iterator),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录1、迭代器(Iterator)1.1、结构1.2、常用方法1.3、本质1、解耦集合与遍历逻辑2、统一

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

JavaSE正则表达式用法总结大全

《JavaSE正则表达式用法总结大全》正则表达式就是由一些特定的字符组成,代表的是一个规则,:本文主要介绍JavaSE正则表达式用法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录常用的正则表达式匹配符正则表China编程达式常用的类Pattern类Matcher类PatternSynta

Redis Cluster模式配置

《RedisCluster模式配置》:本文主要介绍RedisCluster模式配置,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录分片 一、分片的本质与核心价值二、分片实现方案对比 ‌三、分片算法详解1. ‌范围分片(顺序分片)‌2. ‌哈希分片3. ‌虚

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用

Nginx Location映射规则总结归纳与最佳实践

《NginxLocation映射规则总结归纳与最佳实践》Nginx的location指令是配置请求路由的核心机制,其匹配规则直接影响请求的处理流程,下面给大家介绍NginxLocation映射规则... 目录一、Location匹配规则与优先级1. 匹配模式2. 优先级顺序3. 匹配示例二、Proxy_pa