设计模式单例设计模式 应用场景及优缺点

设计模式-单例设计模式  应用场景及优缺点,扩展,多种写法

设计模式就是对未知变化的一种封装方式:

主要的设计原则:1.单一职责原则(这个基本扯淡,实际开发中尽量吧);2.开闭原则;3.里氏替换原则;4.迪米特法则;5.接口隔离原则;6.依赖倒置原则.

单例设计模式又是其中最经典的,面试也问的最多的,所以让我们一起看看单例设计模式吧

其实也就是那么一说,项目开发的这种规则的制定,主要是技术主管的技术选型和项目业务功能的一种磨合选择吧.

实际说一下开发模式,一个一个的来.

 单例模式

目的:确保只有一个实例,并且自行实例化并向系统提供这个实例

直接上代码(我喜欢这种模式)


public class Emperor {

private static final Emperor emperor = new Emperor();

private Emperor() {
}

public static Emperor getInstance() {
return emperor;
}

public static void doSomething() {
System.out.println("做什么事情");
}

} 

 私有构造函数,防止new出来.所以只能通过getInstance来获得本个实例.

单例的优点:

我觉得就两个:1.减少系统的开销;2.对系统级的文件或者映射等做一个单点的操作.

单例的缺点:

  1. 一般不会进行继承或者实现接口.所以扩展性差
  2. 对测试不利.如果在并行开发中,单例没有实例出来,那么是不能进行测试的
  3. 和”单一原则”违背(并没什么luan)

 

使用场景

在一个环境中,要求 有且只有一个对象的时候可以使用.

  1. 一个序列号;
  2. 一个共享数据
  3. 创建一个对象消耗资源过多
  4. 工具类

 

单例的扩展:

要求有限多个实例对象的时候

public class Emperor {
    
    private static Integer MAX_SINGLETON_NUM = 2;
    private static List<Emperor>list = new ArrayList<>();    
    static {
        for (int i = 0; i < MAX_SINGLETON_NUM; i++) {
            list.add(new Emperor());
        }
    }
    private  Emperor() {
        
    }
    public static Emperor getInstance(){
        Random rd = new Random();
        int num = rd.nextInt(MAX_SINGLETON_NUM);
        return list.get(num);
    }   
    public static void doSomething(){
        System.out.println("做什么事情");
    }    
}

补充:单例模式的基本模式

 饿汉:双重验证才能达到真单例

public class Singleton {  
 2     private volatile static Singleton singleton;  
 3     private Singleton (){}   
 4     public static Singleton getSingleton() {  
 5     if (singleton == null) {  
 6         synchronized (Singleton.class) {  
 7         if (singleton == null) {  
 8             singleton = new Singleton();  
 9         }  
10         }  
11     }  
12     return singleton;  
13     }  
14 }  

静态内部类

1 public class Singleton {  

 2     private static class SingletonHolder {  

 3     private static final Singleton INSTANCE = new Singleton();  

 4     }  

 5     private Singleton (){}

 6     public static final Singleton getInstance() {  

 7         return SingletonHolder.INSTANCE;  

 8     }  

 9 }  

其实单例用哪种模式,取决于项目的实际业务需求.如果启动的东西太多希望节约点资源就用”懒汉”,对于这点资源还能消耗,并且希望简单,法改变的就使用”饿汉”,一启动就加载了.

个人喜欢用”饿汉”.

 

感谢单例的七种写法:http://www.blogjava.net/kenzhh/archive/2013/03/15/357824.html

其实就会”饿汉”和有限多个单例,就足够用了.

原文地址:https://www.cnblogs.com/aihuxi/p/8117193.html