zoukankan      html  css  js  c++  java
  • 设计模式单例设计模式 应用场景及优缺点

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

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

    主要的设计原则: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

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

  • 相关阅读:
    selenium 18种元素定位方法
    python3+selenium配置可能报错记录
    adb+monkey压力测试入门
    appscan使用教程(全)
    appium---android元素定位
    QTP自动化测试
    postman Could not get any response。
    Jmeter接口测试+压力测试
    Android 偏门xml属性
    CrashHandler
  • 原文地址:https://www.cnblogs.com/aihuxi/p/8117193.html
Copyright © 2011-2022 走看看