JAVA基础学习20180103-单例模式

1.什么是设计模式
反复使用多人知晓经过分类编目的代码设计经验总结,即设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案

2.三类设计模式
创建型模式(关注对象创建过程的模式):工厂方法模式、创造者模式、抽象工厂模式、原型模式、单例模式
结构型模式(关注对象和类组合的模式):桥接模式、代理模式、享元模式、外观模式、装饰器模式、组合模式、适配器模式
行为型模式(关注对象之间的通信过程):备忘录模式、解释器模式、命令模式、中介者模式、观察者模式、策略模式、状态模式、模板方法模式、访问者模式、迭代子模式、责任链模式

3.单例模式
目的:使得类的一个对象成为该类系统中的唯一实例
定义:一个类有且仅有一个实例,并且自行实例化向整个系统提供
要点:(1)某个类只能有一个实例(2)必须自行创建实例(3)必须自行向整个系统提供这个实例
实现:(1)只提供私有的构造方法(2)含有一个该类的静态私有对象(3)提供一个静态的公有方法用于创建、获取静态私有对象

4.代码实现方案:
饿汉式:对象创建过程中实例化
懒汉式:静态公有方法中实例化

5.饿汉式PK懒汉式
饿汉式:在类加载时就创建实例,空间换时间
懒汉式:第一次使用时进行实例化,时间换空间

6.对于多线程的场景,饿汉式线程安全,懒汉式存在线程风险(解决方法:同步锁、双重校验锁、静态内部类、枚举)

7.单例模式优点:
(1)在内存中只有一个对象,节省内存空间
(2)避免频繁的创建销毁对象,提高性能
(3)避免对共享资源的多重占用

8.单例模式缺点:
(1)拓展比较困难
(2)如果实例化后的对象长期不利用,系统将默认为垃圾进行回收,造成对象状态丢失

9.单例模式使用场景:
(1)创建对象时占用资源过多,但同时又需要用到该类对象
(2)对系统内资源要求统一读写,如读写配置信息
(3)当多个实例存在可能引起程序逻辑错误,如号码生成器

代码:

package com.imooc.singleton;

//饿汉式:创建对象实例的时候直接初始化    空间换时间
public class SingletonOne {
    //1、创建类中私有构造
    private SingletonOne(){

    }

    //2、创建该类型的私有静态实例
    private static SingletonOne instance=new SingletonOne();

    //3、创建公有静态方法返回静态实例对象
    public static SingletonOne getInstance(){
        return instance;
    }
}

package com.imooc.singleton;

//懒汉式:类内实例对象创建时并不直接初始化,直到第一次调用get方法时,才完成初始化操作
//时间换空间
public class SingletonTwo {
    //1、创建私有构造方法
    private SingletonTwo(){

    }

    //2、创建静态的该类实例对象
    private static SingletonTwo instance=null;

    //3、创建开放的静态方法提供实例对象
    public static SingletonTwo getInstance(){
        if(instance==null)
            instance=new SingletonTwo();

        return instance;
    }
}

package com.imooc.test;

import com.imooc.singleton.SingletonOne;
import com.imooc.singleton.SingletonTwo;

public class Test {
    public static void main(String[] args){

        SingletonOne one=SingletonOne.getInstance();
        SingletonOne two=SingletonOne.getInstance();
        System.out.println(one);
        System.out.println(two);
        System.out.println("=======================");
        SingletonTwo one1=SingletonTwo.getInstance();
        SingletonTwo two1=SingletonTwo.getInstance();
        System.out.println(one1);
        System.out.println(two1);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值