zoukankan      html  css  js  c++  java
  • Java中如果把构造方法也私有化,如何创建对象?Java的单例设计模式——饿汉式和懒汉式区别

    Java的单例模式——饿汉式

    package com.swift;
    //Java单例设计模式——恶汉式
    public class SinglePerson {
        private String name="The God";
        private int age=10000;
        private static SinglePerson person=new SinglePerson();//生成对象放在java静态池中,否则如果非静态在堆中,生命周期比类短
        private SinglePerson() {};//构造方法私有化可以避免大量实例化对象而消耗内存
        public static SinglePerson getSinglePerson() {//静态方法类外部可以通过类名.获取
            return person;
        }
        @Override
        public String toString() {
            return "SinglePerson [name=" + name + ", age=" + age + "]";
        }
    }

    Demo类调用

    package com.swift;
    
    public class DemoSinglePerson {
    
        public static void main(String[] args) {
            SinglePerson s=SinglePerson.getSinglePerson();
            System.out.println(s.toString());//得到唯一的对象
        }
    }

    Java的单例模式——懒汉式

    package com.swift;
    
    //单例模式——懒汉模式
    public class SinglePerson$Lazy {
        private String name = "The God";
        private int age = 10000;
        private static SinglePerson$Lazy person = null;// 懒汉是不会这么急的,他要等调用get方法时才生成对象,就位了节省这一个对象的空间
    
        private SinglePerson$Lazy() {
        };// 如果大量使用对象实例化操作来调用对象那么消耗内存会不断增大
    
        public static SinglePerson$Lazy getSinglePerson() {
            synchronized (SinglePerson$Lazy.class) {//静态方法使用的同步锁用——类名.class
                if (person == null) {// 这样的写法在线程中会造成异常,多个线程同时执行创建对象,所以外边加锁,一次只能一个线程进来
                    person = new SinglePerson$Lazy();
                    return person;
                } else {
                    return person;
                }
            }
        }
    
        @Override
        public String toString() {
            return "SinglePerson [name=" + name + ", age=" + age + "]";
        }
    }

    Demo类调用

    package com.swift;
    
    public class DemoSingglePerson$Lazy {
    
        public static void main(String[] args) {
            SinglePerson$Lazy s=SinglePerson$Lazy.getSinglePerson();
            System.out.println(s.toString());
        }
    
    }
  • 相关阅读:
    ES基本介绍
    Mybatis 读写分离简单实现
    分享一个Flink checkpoint失败的问题和解决办法
    一次“内存泄露”引发的血案
    记一次堆外内存泄漏排查过程
    MySQL主从复制读写分离,看这篇就够了!
    JVM运行时内存数据区域
    .NET MVC 页面传值方式
    jQuery 对表格内容进行搜索筛选
    泛型
  • 原文地址:https://www.cnblogs.com/qingyundian/p/7719717.html
Copyright © 2011-2022 走看看