zoukankan      html  css  js  c++  java
  • 【设计模式】之单例模式

    作为程序员必读经典《重构 改善既有代码的设计》《effective java》两本书,对于提升自己代码的优雅程度确实是非常有帮助。这段事件在学习设计模式,看了《大话设计模式》,虽然这是一本很受非议的一本书,但是每一件事情都是小马过河,不亲自试试怎么知道不适合自己呢。

    看过大话设计模式之后,感觉有那么一丝明悟,对于面向对象的理解似乎有那么更近一层的理解,在写优质的代码方面,很有帮助。

    进入正题,单例模式。

    有些对象只需要一个,如:配置文件、工具类、线程池、缓存、日志对象等
    多个程序读取一个配置文件,实际上配置文件还是只有一个,如果创造出多个实例,就会导致很多问题,占用资源过多,不一致的结果等
    单例对象(Singleton)是一种常用的设计模式。在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。这样的模式有几个好处:
    1、某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销。 
    2、省去了new操作符,降低了系统内存的使用频率,减轻GC压力。
    3、有些类如交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个的话,系统完全乱了。(比如一个军队出现了多个司令员同时指挥,肯定会乱成一团),所以只有使用单例模式,才能保证核心交易服务器独立控制整个流程。

    单例模式分类:

    1、饿汉模式 加载类时创建实例,因此加载类比较慢,运行时获取实例比较快,且是线程安全的
    2、懒汉模式 不在类加载时创建,获取时才创建实例,所以类加载时比较快而获取实例是比较慢,且是线程不安全

    注:饿汉和懒汉名称上可以从这样区别:可以从创建实例的角度来考虑,饿汉式可能太饿了,先把实例创建好,
    而懒汉式你要实例的时候我再给你创建,所以就慢了。
     
    饿汉式实例:
    //饿汉式
    class Fruit{
    	
    	public static Fruit fruit = new Fruit();
    	
    	private Fruit(){
    		
    	}
    	
    	public static Fruit getInstance(){
    		return fruit;
    	}
    }
    	public static void main(String[] args) {
    		//饿汉式
    		Fruit f1 = Fruit.getInstance();
    		Fruit f2 = Fruit.getInstance();
    		System.out.println(f1);
    		System.out.println(f2);	
    	}

    懒汉式实例:
    在该懒汉式中如果是单线程的话,可以保证创建一个实例,但是如果多线程的或就不一定了
    懒汉式在多线程中的实例:
    可以在全局方法上我们可以加上同步Sychronized关键字。
    但是还是有问题,因为比如来了两个线程都到了if判断那里面,然后到达同步那时,只能进入一个,然后呢第一个线程进去之后new了一个对象,走了,第二个开始进入也是创建了一个对象,那么问题就出现了两个对象,所以还需改进,那么就在同步里面再加一个判断,那就是双重检查
    public class Person {
    	
    	public static Person person;
    	
    	 //定义私有的构造函数,防止外部进行创建对象
    	private Person(){
    	}
    	
    	public static Person getInstance(){
    		if(person == null){
    			synchronized(Person.class){
    				if(person == null){//双重检查
    					person = new Person();
    				}
    			}
    		}
    		return person;
    	}
    }
    public static void main(String[] args) {
    
    		//懒汉式
    		Person p1 = Person.getInstance();
    		Person p2 = Person.getInstance();
    		System.out.println(p1);
    		System.out.println(p2);
    
    		
    		
    	}


    本贴知识点由大兵哥给我的资料整理而成,发到csdn只是想在做一遍复习和养成写博客的习惯,致谢大兵哥~,大兵哥在平时的学习中给过我很多帮助和学习经验以及笔记。
    原文发布在csdn http://blog.csdn.net/liu10010/article/details/71703489
  • 相关阅读:
    ibatisnet系列
    jQuery弹出层演示
    winform中datagridview的用法
    ASP.net:截取固定长度字符串显示在页面,多余部分显示为省略号
    hdu 4507 恨7不成妻(求l,r中与7不相关数字的平方和)
    hdu 2089 数位dp
    uestc 1307 统计数位之间相差不小于2的数的个数
    Spoj 2319 数位统计(0,1, 2^k1 这些数分成M份)
    zoj 3416 统计平衡数个数
    数位统计 sgu 390 <浅谈数位类问题>
  • 原文地址:https://www.cnblogs.com/suiyue-/p/6847104.html
Copyright © 2011-2022 走看看