为了账号安全,请及时绑定邮箱和手机立即绑定

设计模式之单例

标签:
设计模式

单例模式的引入

读取配置文件

考虑这样一个应用,读取配置文件的内容。很多项目里面,都有与应用先关的配置文件,这些配置文件很多都是由项目开发人员自定义的,在里面定义了一些应用所需要的参数。当然在实际的开发中,这个配置文件有很多种格式,如XML,properties ,现在要读取配置文件,该如何实现喃?

不用模式的解决方案

package com.study.design.pattern.singleton.example;import lombok.Getter;import lombok.Setter;import lombok.ToString;import java.io.IOException;import java.io.InputStream;import java.util.Properties;/**
 * 类的描述:读取应用配置文件
 *
 * @author: like
 * @createDate: 2018年11月12日  20:24
 * @version: v1.0
 * @jdk version used: JDK1.8
 * @see <相关类>
 */@ToStringpublic class AppConfig {    /**
     * 用来存放配置文件参数A的值
     */
    private String parameterA;    /**
     * 用来存放配置文件参数B的值
     */
    private String parameterB;    public String getParameterA() {        return parameterA;
    }    public void setParameterA(String parameterA) {        this.parameterA = parameterA;
    }    public String getParameterB() {        return parameterB;
    }    public void setParameterB(String parameterB) {        this.parameterB = parameterB;
    }    public AppConfig(){        // 读取配置文件
        readConfig();
    }    private void readConfig() {
        Properties p = new Properties();
        InputStream in = null;        try{
            in = AppConfig.class.getResourceAsStream("AppConfig.properties");
            p.load(in);            this.parameterA = p.getProperty("paramA");            this.parameterB = p.getProperty("paramB");
        }catch (IOException e){
            e.printStackTrace();
        }finally {            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }



}

测试类

package com.study.design.pattern.singleton.example;import org.junit.Test;import static org.junit.Assert.*;/**
 * 类的描述:
 *
 * @author: like
 * @createDate: 2018年11月12日  20:38
 * @version: v1.0
 * @jdk version used: JDK1.8
 * @see <相关类>
 */public class AppConfigTest {    @Test
    public void testReadProperties(){
        AppConfig appConfig = new AppConfig();
        String paramA = appConfig.getParameterA();
        String paramB = appConfig.getParameterB();
        System.out.println(appConfig.toString());
        System.out.println("paramA = " + paramA +" paramB = " + paramB);
    }

}

上面的实现很简单,但是有一个问题,就是在系统运行中,很多类都需要用到配置,如果在每一个类中都去 new 一个 Appconfig ,会严重的浪费内存资源,实际上,对于AppConfig这种类而言,只需要在运行的时候有一个实例就好了
总结:类在全局只需要一个实例,怎么实现?

解决方案

使用单例模式来解决问题

什么是单例模式?

单例模式的定义 : 保证一个类仅有一个实例,并提供一个全局的访问点

解决问题的思路

上面代码的问题在于构造方法是公开的,可以构建多个实例,所以构造方法不能公开。

单例模式结构图

webp

image

Singlteton : 负责创建Singleton类的唯一实例,并提供一个getInstance的方法,让外部来访问这个类的唯一实例。

单例模式的分类

graph TD
A[单例模式] -->B(懒汉式)
A[单例模式] -->C(饿汉式)

1.懒汉式实现代码

package com.study.design.pattern.singleton;/**
 * 类的描述:测试懒汉式单例模式
 * 线程安全,调用效率不高,但是可以延迟加载
 *
 * @author: like
 * @createDate: 2018年11月05日  22:35
 * @version: v1.0
 * @jdk version used: JDK1.8
 * @see <相关类>
 */public class SingletonDemo2 {    /*
     * 创建懒汉式的思路
     *
     * 1. 构造器私有化
     * 2. 创建一个私有的static的类属性,懒汉式是创建属性的时候不创建对象
     * 3. 提供一个public的方法用于获取对象
     */

    /**
     * 2. 创建一个私有的static的类属性 , 类初始化的,不加载对象,到使用的时候加载对象
     */
    private static SingletonDemo2 singletonDemo2 ;    /**
     *  1. 构造器私有化
     */
    private SingletonDemo2(){

    }    /**
     * 3. 提供一个public的方法用于获取对象
     * @return SingletonDemo2
     */
    public static synchronized SingletonDemo2 getInstance(){        if(singletonDemo2 == null){
            singletonDemo2 = new SingletonDemo2();
        }        return singletonDemo2;
    }

}



作者:IT_JAVA_文艺男
链接:https://www.jianshu.com/p/4c91bc35785c


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消