Java-设计模式-单例模式-饿汉模式、懒汉模式

//-------------------------------------------------------------饿汉模式--开始-----------------------------------------------------------
package com.study.DesignPattern01;
/**
 * 创建一个饿汉模式的单例
 * @author ZLHome
 *有些对象,我们只需要一个,如果多了,那么就可能导致数据不一致,
    占用资源过多等等,比如:
        配置文件、工具类、线程池、缓存、日志对象
 */
public class Singleton {
    //1、构造方法私有化(这样类就不能被实例化了)
    private Singleton(){
        System.out.println("实例化Singleton类");
    }

    //2、实例化单例对象,对象为静态的(这样就只会实例化一次),私有的(安全,外部不能直接Singleton.instance调用)
    private static Singleton instance = new Singleton();

    //3、提供一个静态方法(静态方法,类可以直接调用),用于获取单例
    public static Singleton getInstance(){
        return instance;
    }
}
//---------------------------------------------------------------------------------------------
package com.study.DesignPattern01;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;

public class SingletonTest {

    @BeforeClass
    public static void setUpBeforeClass() throws Exception {
        System.out.println("Junit开始BeforeClass...");
    }

    @AfterClass
    public static void tearDownAfterClass() throws Exception {
        System.out.println("Junit过后AfterClass...");
    }

    @Before
    public void setUp() throws Exception {
        System.out.println("Junit开始Before...");
    }

    @After
    public void tearDown() throws Exception {
        System.out.println("Junit过后After...");
    }

    @Test
    public void test() {
        System.out.println("Junit开始...");
        Singleton instance = Singleton.getInstance();
        Singleton instance1 = Singleton.getInstance();
        System.out.println("是否相等:"+(instance==instance1));
    }

}
//-------------------------------------------------------------饿汉模式--结束-----------------------------------------------------------

//============================================================懒汉模式--开始============================================================
package com.study.DesignPattern01;

public class Singleton1 {
    //1、将构造方法设置为私有(这样类就不能被外部实例化了)
    private Singleton1(){
        System.out.println("实例化Singleton1");
    }

    //2、申明单例对象
    private static Singleton1 instance;

    //3、提供一个静态方法(静态方法属于类),用于外部调用
    public static Singleton1 getInstance(){
        if(instance==null){
            System.out.println("第一次实例化Singleton1对象");
            instance=new Singleton1();
        }
        return instance;
    }
}

//============================================================

package com.study.DesignPattern01;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;

public class Singleton1Test {

    @BeforeClass
    public static void setUpBeforeClass() throws Exception {
        System.out.println("Junit开始BeforeClass...");
    }

    @AfterClass
    public static void tearDownAfterClass() throws Exception {
        System.out.println("Junit过后AfterClass...");
    }

    @Before
    public void setUp() throws Exception {
        System.out.println("Junit开始Before...");
    }

    @After
    public void tearDown() throws Exception {
        System.out.println("Junit过后After...");
    }

    @Test
    public void test() {
        System.out.println("Junit开始...");
        Singleton1 instance = Singleton1.getInstance();
        Singleton1 instance1 = Singleton1.getInstance();
        System.out.println("是否相等:"+(instance==instance1));
    }

}

//============================================================懒汉模式--结束============================================================

设计模式
可靠性更高、更容易理解、扩展性更好‘更容易维护
1、单例模式:
1)单例背景、情况:
有些对象,我们只需要一个,如果多了,那么就可能导致数据不一致,
占用资源过多等等,比如:
配置文件、工具类、线程池、缓存、日志对象
2)原理:
实例化对象是通过构造方法来实现的(程序类未写,则程序类有默认的构造方法),
单例只允许获取一个实例,所以

饿汉模式:
类加载的时候就实例化对象(比较饿,主动实例对象)
(1)实现单例就去改写构造方法:将构造方法改写为私有的,改写之后,就不能直接实例化了(不允许外部直接创建实例)
(2)创建类的唯一实例(类里面去new一个实例,且这个实例是static[变量、方法加static后就变成类所有,不是必须创建实例对象来调用],这样就可以通过类直接调用这个实例[类名.实例变量名])
(3)为了安全,不允许外部直接访问成员变量,所以(2)需要优化,将类的static实例变为private,变为private之后就不能直接通过"类名.实例变量名"来访问了,所以提供类的方法get,类的get方法也需要是static才能通过"类名.方法名"调用

懒汉模式:
类加载的时候只是声明一下,调用这个单例的时候才实例化(比较懒,不主动去实例对象)
(1)先声明一个单例,并不实例化单例对象
(2)在get方法里面去判断,如果没有实例这个对象,就将单例对象实例化再返回

对比:
懒汉模式:类加载快,获取对象慢,线程安全的
饿汉模式:类加载慢,获取对象快,线程不安全

总结:static修饰的变量、方法数据类,可以通过类直接调用

时间: 2024-10-19 18:57:09

Java-设计模式-单例模式-饿汉模式、懒汉模式的相关文章

单例模式--饿汉、懒汉、多线程以及多线程下改进

代码注释有介绍 package singleton; /** * @author: ycz * @date: 2018/12/24 0024 22:15 * @description: 懒汉模式 */ public class SingleTon1 { public SingleTon1(){} private static SingleTon1 instance1 = null; public static SingleTon1 getInstance1(){ if (instance1==n

java GOF23单例模式-饿汉式图

原文地址:https://blog.51cto.com/14437184/2439983

[Js-设计模式]单例模式(饿汉,懒汉,登记式)

·单例模式的特点: 1. 单例类只能有一个实例. 2. 单例类必须自己创建自己的唯一实例. 3. 单例类必须给所有其他对象提供这一实例. ·各种单例模式的特点: ·懒汉式是延时加载,在需要的时候才创建对象,避免内存浪费,但存在线程安全问题. ·饿汉式线程安全,类一加载就实例化对象,所以要提前占用系统资源. ·登记式单例模式克服了饿汉以及懒汉单例的不可继承问题,其子类在登记时才被创建,并且子类的实例化方式只能是饿汉式. ·各种单例模式的类图: ·饿汉式单例模式 ·懒汉式单例模式: ·登记式单例模式

Java设计模式(一)普通工场模式,抽象工场模式

设计模式 设计模式我觉得是前人总结的,为了解决一类问题而总结的代码设计经验.最初可能为了使用而使用,后面就会发现,很多没想到的问题因为使用了正确的设计模式已经为你考虑到了.<design patterns设计模式>这本书是程序员进阶必学. (一)工厂模式 工厂模式的意义在于定义一个用于创建对象的接口,并控制返回哪个类的实例.网上比较流行的一个普通工厂模式的例子. interface Sender{ public void send(); } class MainSender implement

Java设计模式(三)-装饰者模式

我们都知道,可以使用两种方式给一个类或者对象添加行为. 一是使用继承.继承是给一个类添加行为的比较有效的途径.通过使用继承,可以使得子类在拥有自身方法的同时,还可以拥有父类的方法.但是使用继承是静态的,在编译的时候就已经决定了子类的行为,我们不便于控制增加行为的方式和时机. 二是使用关联.组合即将一个对象嵌入到另一个对象中,由另一个对象来决定是否引用该对象来扩展自己的行为.这是一种动态的方式,我们可以在应用程序中动态的控制. 与继承相比,关联关系的优势就在于不会破坏类的封装性,且具有较好的松耦合

Java设计模式(四) 装饰器模式 代理器模式

(七)装饰器模式 Decorator 装饰器模式是为了动态的给一个对象增加一些新功能.装饰对象与被装饰的对象需要实现同一个接口,装饰对象持有被装饰对象的实例. interface DecoratorSourceable{ public void method(); } //被装饰类 class DecoratorSource implements DecoratorSourceable{ public void method(){ System.out.println("Source"

Java设计模式(九)责任链模式 命令模式

(十七)责任链模式 责任链模式的目的是通过给予多个对象处理请求的机会,已解除请求发送者与接受者之间的耦合关系.面对对象的开发力求对象之前保持松散耦合,确保对象各自的责任最小化,这样的设计可以使得系统更加容易修改,同时降低产生缺陷的风险. public class ChainTest { public static void main(String[] args) { String pass1="123456"; String pass2="123456"; Stri

Java设计模式(八)观察者模式 迭代器模式

(十五)观察者模式 观察者模式,定义对象间一对多关系,一个对象状态发生改变,所有依赖于它的对象都收到通知并且自动更新,观察者与被观察者分开.例如邮件订阅.RSS订阅,如果有更新就会邮件通知你. interface Observers{ public void update(); } class Observer1 implements Observers{ public void update(){ System.out.println("observer1 has received"

Java设计模式(一) 简单工厂模式不简单

原创文章,转载请务必将下面这段话置于文章开头处. 本文转发自Jason's Blog,原文链接 http://www.jasongj.com/design_pattern/simple_factory 简单工厂模式使用案例 有一种抽象产品--汽车(Car),同时有多种具体的子类产品,如BenzCar,BMWCar,LandRoverCar.类图如下 作为司机,如果要开其中一种车,比如BenzCar,最直接的做法是直接创建BenzCar的实例,并执行其drive方法,如下 package com.

Java 设计模式系列(九)组合模式

Java 设计模式系列(九)组合模式 将对象组合成树形结构以表示"部分-整体"的层次结构.组合模式使得用户对单个对象的使用具有一致性. 一.组合模式结构 Component: 抽象的组件对象,为组合中的对象声明接口,让客户端可以通过这个接口来访问和管理整个对象结构,可以在里面为定义的功能提供缺省的实现. Leaf: 叶子节点对象,定义和实现叶子对象的行为,不再包含其它的子节点对象. Composite: 组合对象,通常会存储子组件,定义包含子组件的那些组件的行为,并实现在组件接口中定义