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

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

相关文章

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

SpringBoot如何通过Map实现策略模式

《SpringBoot如何通过Map实现策略模式》策略模式是一种行为设计模式,它允许在运行时选择算法的行为,在Spring框架中,我们可以利用@Resource注解和Map集合来优雅地实现策略模式,这... 目录前言底层机制解析Spring的集合类型自动装配@Resource注解的行为实现原理使用直接使用M

java常见报错及解决方案总结

《java常见报错及解决方案总结》:本文主要介绍Java编程中常见错误类型及示例,包括语法错误、空指针异常、数组下标越界、类型转换异常、文件未找到异常、除以零异常、非法线程操作异常、方法未定义异常... 目录1. 语法错误 (Syntax Errors)示例 1:解决方案:2. 空指针异常 (NullPoi

C#原型模式之如何通过克隆对象来优化创建过程

《C#原型模式之如何通过克隆对象来优化创建过程》原型模式是一种创建型设计模式,通过克隆现有对象来创建新对象,避免重复的创建成本和复杂的初始化过程,它适用于对象创建过程复杂、需要大量相似对象或避免重复初... 目录什么是原型模式?原型模式的工作原理C#中如何实现原型模式?1. 定义原型接口2. 实现原型接口3

Java反转字符串的五种方法总结

《Java反转字符串的五种方法总结》:本文主要介绍五种在Java中反转字符串的方法,包括使用StringBuilder的reverse()方法、字符数组、自定义StringBuilder方法、直接... 目录前言方法一:使用StringBuilder的reverse()方法方法二:使用字符数组方法三:使用自

大数据spark3.5安装部署之local模式详解

《大数据spark3.5安装部署之local模式详解》本文介绍了如何在本地模式下安装和配置Spark,并展示了如何使用SparkShell进行基本的数据处理操作,同时,还介绍了如何通过Spark-su... 目录下载上传解压配置jdk解压配置环境变量启动查看交互操作命令行提交应用spark,一个数据处理框架

Python依赖库的几种离线安装方法总结

《Python依赖库的几种离线安装方法总结》:本文主要介绍如何在Python中使用pip工具进行依赖库的安装和管理,包括如何导出和导入依赖包列表、如何下载和安装单个或多个库包及其依赖,以及如何指定... 目录前言一、如何copy一个python环境二、如何下载一个包及其依赖并安装三、如何导出requirem

Rust格式化输出方式总结

《Rust格式化输出方式总结》Rust提供了强大的格式化输出功能,通过std::fmt模块和相关的宏来实现,主要的输出宏包括println!和format!,它们支持多种格式化占位符,如{}、{:?}... 目录Rust格式化输出方式基本的格式化输出格式化占位符Format 特性总结Rust格式化输出方式

Java实现状态模式的示例代码

《Java实现状态模式的示例代码》状态模式是一种行为型设计模式,允许对象根据其内部状态改变行为,本文主要介绍了Java实现状态模式的示例代码,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来... 目录一、简介1、定义2、状态模式的结构二、Java实现案例1、电灯开关状态案例2、番茄工作法状态案例

Python中连接不同数据库的方法总结

《Python中连接不同数据库的方法总结》在数据驱动的现代应用开发中,Python凭借其丰富的库和强大的生态系统,成为连接各种数据库的理想编程语言,下面我们就来看看如何使用Python实现连接常用的几... 目录一、连接mysql数据库二、连接PostgreSQL数据库三、连接SQLite数据库四、连接Mo