设计模式_单例模式

来源:互联网 发布:python编写一个小程序 编辑:程序博客网 时间:2024/05/03 07:33

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;//单例模式:可以保证系统中一个类只有一个实例,并且,这个实例容易被外界调用。好处就是节省系统的资源//如果希望系统中的某个类的对象只有一个,这个时候你可以选择用单例 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!

我是菜鸟,我在路上。

0 0