A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王广彬 中级黑马   /  2012-7-26 23:50  /  2397 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

单态设计模式都是在什么情况下使用?  对这一块不是很清楚.

评分

参与人数 1技术分 +1 收起 理由
田向向 + 1 新同学鼓励一下,继续加油

查看全部评分

6 个回复

正序浏览
李菁 中级黑马 2012-7-27 13:17:14
7#
只需要使用一个单独的资源,并且需要共享这个单独资源的状态信息时,就能用到单例模式。
如果程序中重复的创建了同一个类的很多对象,通过应用单例模式则可以很好的避免创建通常的对象。这可以减少系统用来创建对象的时间,也可以节省垃圾收集器用来释放这些实例的时间
例如一个播放器程序,当用户打开一个播放音乐界面,再想打开另一个音乐播放时,之前的界面就关闭了。这就是一个单利模式的具体应用
其实单例模式通常和工厂模式一起使用
回复 使用道具 举报
很简单 就是为了保证对象在类中的唯一性 无论外部怎么调用,它所得到的对象都是唯一的
回复 使用道具 举报
你希望程序使用者不能随意自己创建对象,只能获取一个单独的对象,即只有一个实例存在。可以通过私有化构造函数,再对外提供一个获取这个对象的函数解决。有的时候需要一个全局对象,比如多线程卖票,多少窗口卖,也只是那么多票。又比如系统日志,多线程访问一个程序,需要记录日志,你不希望到时候看到N多个日志文件实例吧?就把日志单例化。
回复 使用道具 举报
单例模式是为了保证一个类在内存中只有一个对象.
1.在单例模式中构造方法是私有的,这样就保证了其他类无法创建本类对象。
2.为了让其他类可以访问本类对象,在本类中添加了一个公共方法(getInstance()),并将此方法设为静态的,通过这个方法其他类可以使用本类对象,而不需要创建。
应用场景:比如读取配置文件的对象,只需要一个,对数据库进行增删改的对象也应保证只有一个,还有游戏中起中央控制器作用的类,也应只有一个
单例模式的两种形态:饿汉式和懒汉式(见图片)

饿汉式.png (13.69 KB, 下载次数: 35)

饿汉式

饿汉式

懒汉式.png (33.28 KB, 下载次数: 35)

懒汉式

懒汉式

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

回复 使用道具 举报
1.如果一个类始终只能创建一个实例,则这个类被称为单例类(单态类)。
2.应用场景:在一些场景中,当要求不允许自由创建该类的对象,而只允许创建一个对象时,为了避免其他类自由创建该类的实例,我们将该类的构造器使用private修饰,从而将该类所有的构造器隐藏起来。
3.随之我们提供一个public方法作为该类的访问点,用于创建该类的对象,并使用static方法修饰(因为调用该方法前不存在对象,只能使用类来调用)。
4.单例类必须缓存已经创建的对象,否则该类无法知道是否曾经创建该对象,也就无法保证只创建一个对象。因此需要创建一个成员变量来保存已经创建的对象,并且变量需要被创建对象的静态方法访问,故该变量以static修饰。
范例如下:
  1. public class Singleton {
  2.    
  3.     private static Singleton sing;

  4.     private Singleton() {
  5.         
  6.     }
  7.    
  8.     public static Singleton getInstance() {
  9.         if (sing == null) {
  10.             sing = new Singleton();
  11.         }
  12.         return sing;
  13.     }
  14. }
复制代码
回复 使用道具 举报
如果一个类只能有一个实例存在,那么这个类就要设计成单例模式的,目的就是不让外界创建这个类的实例,
但是又为了能够让外界使用到这个类的实例,那么就要在这个类中自己创建,再通过public static的一个方法将
实例提供给外界,不管外界获取多少次这个类的实例,都是同一个实例,这就是单利模式,在后面的学习中,
你会接触到工厂设计模式,那个就是典型的单利设计模式,比如,你要在项目的多个类中使用操作数据库的
对象,而创建这种对象又是很消耗资源的,那么,你就可以使用单利设计模式:
伪代码示例:
Pulbic class DBManager {
      //在类加载是自己创建实例
      private static final DBManager instance = new DBManager();
      //数据库驱动管理对象
      private DriverManager driverManager;

      //构造器要私有化,防止外部创建实例
      private DBManager() {
           //加载数据库驱动
          driverManager =  Class.forName(DriverName);
      }

      //要将本类的实例提供给外界使用
      public static DBManager getInstace() {
            return instance;
     }

      //获得数据库链接
      public Connection getConnection() {return driverManager.getConnection();}
      
       //关闭数据库链接
       public void close(Connection conn) {conn.close();}
}


//StudentDao
public class StudentDao {
       //这里要用到DBManager
      DBManager dbm = DBManager.getInstance();
}

//ThearchDao
public class ThearchDao {
       //这里要用到DBManager
      DBManager dbm = DBManager.getInstance();
}

//StudentDao和ThearchDao中得到的是同一个对象。。。
我写的伪代码,,看思想就可以了

评分

参与人数 1技术分 +1 收起 理由
田向向 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马