• JAVA设计模式单例模式


    JAVA设计模式--单例模式

    1. 经典单例模式的原理    

    1.1 意义:有些类,实际应用中往往只能有一个对象。可能用可能不用,用也只能用这一个对象,比如打印机,显卡日志对象等,这样不会导致冲突,使结果一致。

    1.2 问题解决:是否可以考虑静态变量方式来实现(构造方法私有化)?或者程序员之间协商全局变量。

    1.3 单例模式:确保一个类最多只有一个实例,并提供一个全局访问点。

    1.4 实际操作:使用private自己内部调用

    单例模式类图:

     

    案例:巧克力工厂

    普通类中,因为工厂只有一个,但是实例有多个,这时会导致状态不一致,可以考虑用单例模式。

     

    public class ChoclateFactory {
        private boolean empty;
        private boolean boiled;
        private static ChoclateFactory uniqeInstance=null ;
        
        
        private ChoclateFactory(){
            empty=true;
            boiled=false;
         }
         //构造类对象
         public static ChoclateFactory getInstance() {
             //是否为空,同事调用时保持状态不变
             if(uniqeInstance==null){
                 uniqeInstance=new ChoclateFactory();
             }
             return uniqeInstance;
            
        }
         
        public void Fill() {
            if(empty){
                //添加
                empty=false;
                boiled=false;
            }
        }
        
        public void Boil() {
            if((!empty)&&(!boiled)){
                
                boiled=true;
            }
        }
        public void Drain() {
            if(!empty&&boiled){
                
                empty=true;
            }
        }
    }

    使用过程中,会出现一些问题,例如多线程(两个线程获取两个对象,无法保证唯一性)。

    解决方法:①在getInstance添加一个同步锁(保证一个线程结束后,在执行下一个线程)

    public static synchronized ChoclateFactory getInstance()

    但是同步锁比较消耗资源,能解决问题,但不建议使用。

    ②“急切”创建实例

        private static ChoclateFactory uniqeInstance=new ChoclateFactory() ;

    调用运行时,直接创建对象,getInstance()直接返回,弥补了同步锁的资源消耗,但是如果不用工厂时,也会创建对象占用资源。

    ③双重检查加锁方法:

    //volatile编译器使用处理多线程安全
        private volatile static ChocolateFactory uniqeInstance=null ;
    //构造类对象
         public static  ChocolateFactory getInstance() {
             //是否为空,同事调用时保持状态不变
             if(uniqeInstance==null){
    //第一个线程执行到这里,为空.若第二个线程也到这里,也要为空,new对象,返回.二者只能一个进入
    //获取到一个对象,返回;另一个线程重新进入时,判断不为空,跳出(只要进入一次,就不会为空了).
    synchronized (ChocolateFactory.class){ if(uniqeInstance==null){ uniqeInstance=new ChocolateFactory(); } } } return uniqeInstance; }

     实际使用过程中建议使用②③这两种方法

    2.单例模式的分类

    单例模式有很多表现形式,常见的有懒汉式,饥汉式,登记式

    懒汉式:是指类保留的对象的创建时间是在需要时进行(用到时才创建);

    饥汉式:和懒汉式相反,类保留的对象在第一次访问时就创建了(和上面的"急切"创建法一致);

     

     

  • 相关阅读:
    linux下通过命令行重启服务,查看id,更改tv密码
    windows渗透相关、hideadmin工具隐藏用户账号、添加隐藏用户
    windows服务隐藏 以及进程隐藏
    nat32 winh命令远程执行难点
    anydesk命令行使用
    html页面,能用鼠标滚轮滑动,但是不能触屏滑动
    Java 全局统一异常捕获
    git 常用操作
    vue v-for强制刷新
    flutter-TextField垂直居中
  • 原文地址:https://www.cnblogs.com/yulibo/p/8735033.html
Copyright © 2020-2023  润新知