**面向对象三大特征--多态之单例模式**

面向对象三大特征–多态之单例模式

1 单例模式概念
(1)单例模式名词解释
-----单:一个;
-----例:实例instance(对象);
-----模式:就是一种设计模式[为了解决某类问题,而提出的比较好的解决方案].
(2)概念
1)单利模式概念:需要设计一个类,达到的效果, 此类在整个应用中只存在一个对象;
2)整个应用:java代码写好的一个应用软件,系统:java代码开发结果,运行在JVM[处于]JRE运行环境};
3)应用软件:java代码开发的;
4)单利模式好处:节省了系统资源,节省了内存空间;
5)单利模式对象怎么用 : 如果系统很多位置都会用到该对象,通过该对象的引用地址对其引用.
2 思路设计
如何达到这样的效果:设计一个类,这个类的对象,永远只有一个?
1)设计一个类 class A{}
2)对象怎么来的?new A(); 调用一次构造方法就得到一个对象
3)把构造方法私有化,本类的外部就不能够随意的访问创建对象了
4)思考 : 一个类的所有构造方法都被私有化,就不能够创建对象了,说法正确吗?不正确
5) 外部不能创建,自己内部可以创建
6)可以在A类内部创建好一个,并保存起来,别人需要对象给它一个地址.
3.单例模式代码实现
3.1设计实现之饿汉模式
(1)构造方法私有化;
(2)在类的内部创建一个对象;
(3)使用一个字段保存起来;
(4)提供一个方法允许外部使用该方法访问该字段;
(5)提供的方法必须静态修饰,因为外部不能创建对象;
(6)外部通过方法访问instance 字段,方法静态修饰,所以字段必须静态修饰;
(7)字段不私有化,别人可以通过类名.instance修改子字段值,所以必须私有化.

class SingletonDemo {
 /*单例模式:只有一个实例
    1.将构造方法私有化
    2.在类中提供一个可以得到该类对象的方法
 */
 public static void main(String[] args){
  TestUtil tl1=TestUtil.getInstance();
  TestUtil tl2=TestUtil.getInstance();
   System.out.println(tl1==tl2);//true
 }
}
class TestUtil{
 //饿汉模式
 private TestUtil(){}
    private static  TestUtil tl=new TestUtil();
 public static TestUtil getInstance(){
    return tl;
 }
}

3.2 设计实现之懒汉模式
(1)明确:应用程序在第一次调用方法获取单利模式对象的时候创建对象
(2)构造方法私有化
(3) 设置一个A类类型的字段私有化不初始化值
(4)提供一个方法允许外部使用该方法访问该字段
(5) 外部不能创建对象,所以方法必须static修饰

class SingletonDemo {
 public static void main(String[] args){
   TestUtil t1=TestUtil.getInstance();
   TestUtil t2=TestUtil.getInstance();
  System.out.println(t1==t2);
 }
}
class TestUtil{
 //懒汉模式
 private TestUtil(){}
    private static TestUtil tl;
 public static TestUtil getInstance(){
    if(tl==null){
       tl = new TestUtil();
    }
   return tl;  
 }
}

4 懒汉模式存在线程安全问题分析
(1)懒汉模式存在线程安全问题:有可能返回的不是同一个对象;
在这里插入图片描述
(2)线程A1,A2对代码的访问都是独立的;
(3)线程A1,执行到位置A1 切换到A2 ,线程A2执行到位置A2;
(4) A1线程继续执行,创建对象初始化instance,返回!切换到线程A2,继续执行又创建了对象给instance赋值,instance原来A1创建的对象地址值,被覆盖,A2会返回自己新创建的地址值。A1,A2线程返回的不是同一个对象;
(5)解决办法:加锁,A1,A2 必须访问的是同一把锁!
5 单例模式应用场景
(1)要设计在工具类中,例如Arrays中!static静态修饰方法;
(2)单利模式设计在一个工具类中:好处!不用频繁的去创建创建对象;
(3)频繁创建对象的不好之处:消耗系统资源,对象过多占用内存;
(4)JavaEE:JDBC数据裤链接的时候,还会使用到单利模式 .

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值