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!
我是菜鸟。我在路上。