首页 > 其他分享 >单例模式和多例模式的总结

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

时间:2023-01-03 10:33:37浏览次数:41  
标签:Singleton 多例 模式 static private 单例 public


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

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

单例模式的关键有两点:

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通常很难重现和查找;

标签:Singleton,多例,模式,static,private,单例,public
From: https://blog.51cto.com/u_15928064/5984715

相关文章

  • 适配器模式
    概述《设计模式》一书中对“适配器模式”的动机描述如下:将一个类的接口转换成客户希望的另一个接口,适配器模式使得原本由于接口不兼容而不能一起工作的类可以一起工作......
  • 笔记本 AUTO模式是什么意思
    相关文章电脑AUTO是什么意思https://zhidao.baidu.com/question/1645428036244428940.html##简介电脑屏幕、显示器上的按键“AUTO”是用来自动校对屏幕显示的位置的按......
  • python设计模式
    设计模式设计模式中使用了一个接口类abc:AbstractBaseClasses作用:在代码中定义和使用抽象基类进行API检查。​为什么使用abc模块Abstractbaseclasses由一组接口组......
  • redis单节点与集群模式
    23.redis实战Dockerfileroot@k8s-master1:~/k8s-data/dockerfile/web/magedu/redis#catDockerfile#RedisImageFROMharbor.nbrhce.com/baseimages/centos:7.9.20......
  • 基于 Dojo toolkit 实现 web2.0 的 MVC 模式
    前言MVC模式是设计模式中的经典模式,它可以有效的分离数据层,展示层,和业务逻辑层。Web2.0技术由于其良好的用户体验被广泛应用于WEB应用的展示层。但是在传统的web开发......
  • 使用Qt和Interpreter设计模式开发计算器(附源码)
    计算器软件其实有很多种,但是基本上都是模仿计算器,用鼠标点击按键来操作,这次我们反其道而行之,采用类似文本输入的操作方式。功能1.键盘输入算式,回车后计算结果。2.根据当前......
  • KMP字符串模式匹配详解
    KMP字符串模式匹配详解KMP字符串模式匹配通俗点说就是一种在一个字符串中定位另一个串的高效算法。简单匹配算法的时间复杂度为O(m*n);KMP匹配算法。可以证明它的时间复杂度......
  • 单例模式
    概述《设计模式》一书中对单例模式的“动机”描述如下:保证一个额类仅有一个实例,并提供一个访问它的全局访问点一般情况下,为了避免资源的浪费,可以考虑将一些不可变类......
  • BigDecimal 舍入模式(Rounding mode)中的ROUND_UNNECESSARY
    BigDecimal.ROUND_UNNECESSARY翻译:舍入模式可以断言所请求的操作具有准确的结果,因此不需要舍入。如果在产生不精确结果的操作上指定了这种舍入模式,则会引发ArithmeticExcept......
  • 光猫两种模式
    光猫光猫的两种模式路由模式​ 路由模式安装简单,但性能弱,在线设备过多,就会出现网络缓慢的情况,这也是大部分人家里的光猫模式。桥接模式​ 桥接模式,由于拨号......