• 设计模式(一)---单例模式


    单例模式

     英文名称:(Singleton Pattern)

     定义:确保某一个类仅仅用一个实例,并且自行实例化并向整个系统提供这个实例

    UML图:


    public class SingletonTest {
    	public static void main(String[] args) {
    		//通过Singleton对外暴漏的方法。进行实例化。并保证仅仅有一个实例
    		Singleton single = Singleton.getInstance();
    		System.out.println(single.toString());
    	}
    }
    //又称饿汉式单例模式
    class Singleton{
    	private static final Singleton single = new Singleton();
    	private Singleton(){
    		
    	}
    	public static Singleton getInstance(){
    		return single;
    	}
    }
    //又称懒汉式单例模式
    //<span style="font-size:18px;">懒汉式单例模式在遇到高并发情况,系统有压力增大。可能会出现多个实例的对象。</span>
     class Singleton1{
    	private static Singleton1 single = null;
    	private Singleton1(){
    		
    	}
    	public static Singleton1 getInstance(){
    		if(single==null){
    			synchronized (Singleton1.class) {   //
    				if(single==null){
    					single = new Singleton1();
    				}
    			}
    		}
    		return single;
    	}
    }

    (依照书本上的总结,自己理解并不太深刻。。)

     单例模式的长处:
      1、单例模式内存中仅仅有一个实例,降低内存开支,一个对象须要频繁的创建和销毁。

    使用单例模式具有非常大的优势。
      2、单例仅仅生成一个实例,降低系统的性能开销。
      3、单例模式能够在避免对资源的多重占用。
      4、单例模式能够在系统设置全局的訪问点。优化和共享资源訪问。
      单例模式的缺点:
      1、单例模式一般没有接口,扩展非常困难。
      2、单例对測试不利
      3、单例与单一职责原则有冲突。
     
      单例的使用场景:
      1、要求生成唯一序列号的环境
      2、在整个项目中须要一个共享訪问点或訪问数据
      3、创建一个对象须要消耗的资源过多
      4、须要定义大量的静态常量和静态方法。

    单例的拓展
      通过单例的拓展,让类仅仅产生两个或者多个实例对象。

    UML图

    public class EmperorTest {
    	public static void main(String[] args) {
    		for(int i=0;i<5;i++){
    			//获取Emperor对象的实例
    			Emperor e = Emperor.getEmperor();
    			e.say();
    		}
    	}
    }
    class Emperor{
    	//定义一个list集合。用来存放对象的实例
    	private static List<Emperor> listEmperor = new ArrayList<Emperor>();
    	private static int maxNum = 2;
    	//定义一个list集合,为创建的对象设置编号。

    private static List<String> listNumofEmperor = new ArrayList<String>(); //表示当前编号 private static int currentNum = 0; //创建出全部的对象 static{ for(int i=0;i<maxNum;i++) listEmperor.add(new Emperor("实例化.."+(i+1)+"..对象")); } private Emperor(String name){ listNumofEmperor.add(name); } public static Emperor getEmperor(){ Random random = new Random(); currentNum = random.nextInt(maxNum); return listEmperor.get(currentNum); } public void say(){ System.out.println(listNumofEmperor.get(currentNum)); } }



  • 相关阅读:
    SPOJ LCS2
    SPOJ NSUBSTR
    1977: [BeiJing2010组队]次小生成树 Tree
    2002: [Hnoi2010]Bounce 弹飞绵羊
    P3690 【模板】Link Cut Tree (动态树)
    P2093 [国家集训队]JZPFAR
    2648: SJY摆棋子
    HDU 2966 In case of failure
    bzoj 一些题目汇总
    BZOJ3653谈笑风生——可持久化线段树+dfs序
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/6727692.html
Copyright © 2020-2023  润新知