• 设计模式_单例模式



    Singleton Pattern
    Ensure a class has one instance,and provide a global point of access to it. 确保某一个类仅仅有一个实例,并且自行实例化并向整个系统提供这个实例。


    皇帝仅仅有一个
    首先我们来想想,怎样获取一个对象,通常是通过new来实现。高级的通过反射,可是该怎样禁止外部创建对象。
    answer : 将构造方法设为私有



    长处: 降低内存开支,一个对象须要频繁的创建,销毁时。 避免了子类的多重占用,设置全局的訪问点。优化和共享资源訪问。
    缺点: 扩展性差,我想着是它的长处吧。

    使用场景:
    要求生成唯一序列号
    整个项目中须要一个共享訪问点或共享数据
    工具类

    饿汉式和懒汉式的比較

    <span style="font-size:12px;">public class Emperor {
     private final static Emperor emperor =new Emperor();
     
     private Emperor(){}
     
     public static Emperor instance(){
      return emperor;
     }
     public void order(){
      System.out.println("吾皇有旨");
     }
    }</span>
    <span style="font-size:12px;">public class Emperor {
     private final static Emperor emperor = null;
    
     private Emperor() {
     }
    
     public static synchronized Emperor instance() {
      if (emperor == null) {
       return new EmperorII();
      } else {
       return emperor;
      }
     }
     public void order() {
      System.out.println("吾皇有旨");
     }
    }</span>

    对照:饿汉式主要须要考虑的问题是效率问题,类载入实例化对象时,须要内存。自然就加重了JVM的负担
            懒汉式攻克了上述问题。延时载入,可是须要注意的是多线程中的线程同步问题就可以。

    以下就是之前项目中的一个应用。可惜当时讲的时候还不懂。如今最终懂了。


    <span style="font-size:12px;">import java.io.IOException;
    import java.io.InputStream;
    import java.util.Properties;
    
    //单例模式:能够保证系统中一个类仅仅有一个实例,而且,这个实例easy被外界调用。优点就是节省系统的资源
    //假设希望系统中的某个类的对象仅仅有一个,这个时候你能够选择用单例
     
    public class Myproperties extends Properties {
     
     private static Myproperties mypro=null;  //对外提供的实例
     
     /**
      * 单例的核心就是   构造方法私有化
      */
     private Myproperties(){
      //比db.properties中读取全部的配置,
      //通过类的反射实例,获取classpath类路径下的资源文件db.properties,并建立一个流
      InputStream is=this.getClass().getResourceAsStream("/db.properties");
      try {
       this.load(is);   //把流变为一个properties 结构的文档    ,从输入流
      } catch (IOException e) {
       e.printStackTrace();
       LogUtil.log.error(e.toString());
      }finally{
       try {
        is.close();
       } catch (IOException e) {
        e.printStackTrace();
        LogUtil.log.error(e.toString());
       }   //关闭流
      }
     }
     
     /**
      * 对外提供一个获取唯一实例的方法
      * @return
      */
     public static Myproperties getMyproperties(){
      if( mypro==null){
       mypro=new Myproperties();
      }
      return mypro;
     }
    }</span>
    <span style="font-size:12px;">/**
      * 获取数据库连接的方法
      * @return:返回获取到的连接
      */
     public Connection getConnection() {
      try {
       con = DriverManager.getConnection(Myproperties.getMyproperties()
         .getProperty("url"), Myproperties.getMyproperties());
      } catch (SQLException e) {
       e.printStackTrace();
       LogUtil.log.error(e.toString());
      }
      return con;
     }</span>

    近期打了俩天的LOL。之前学的有点烦,没有实际应用。还好近期调整好了状态,keep going!


    我是菜鸟。我在路上。

  • 相关阅读:
    get请求中文乱码及get,post编码探究
    spring使用redis做缓存
    tomcat中session在两个webapp中实现共享
    JDK8 HashMap 源码解析
    Windows Apache服务器配置
    怎么使用IDEA
    面试中的Java链表
    设计模式解密(12)- 桥接模式
    Caused by: org.apache.catalina.LifecycleException: A child container failed during start
    设计模式解密(11)- 命令模式
  • 原文地址:https://www.cnblogs.com/zsychanpin/p/7190086.html
Copyright © 2020-2023  润新知