黑马程序员-设计模式之单例设计模式
来源:互联网 发布:数据库引擎是什么 编辑:程序博客网 时间:2024/06/08 05:55
-----------android培训、java培训、java学习型技术博客、期待与您交流! ------------
一、设计模式:
解决某类问题行之有效的方法,是一种思想,是规律的总结。
二、单例设计模式解决的问题:
保证某个类在内存中只有一个对象。
三、什么时候使用:
当前对象的创建比较消耗资源,我们在使用这个对象时只需要有一个就可以应用。这个时候就可以将其设计成单例的模式。
比如:多程序读取一个配置文件时,建议配置文件封装成对象。会方便操作其中数据,又要保证多个程序读到的是同一个配置文件对象,就需要该配置文件对象在内存中是唯一的。
又比如说银行的号码管理器等。
四、如何保证对象唯一性呢?
1、思想:
(1)不让其他程序创建该类对象。
(2)在本类中创建一个本类对象。
(3)为外界能访问此对象,将对象的引用通过公共访问方法暴露给外界对外提供方法,让其他程序获取这个对象(方法必须是静态的,才能被类调用)。
2、步骤:
(1)因为创建对象都需要构造函数初始化,只要将本类中的构造函数私有化,其他程序就无法再创建该类对象;
(2)类内部创建对象,自身进行实例化,从而调用功能(引用必须为私有静态的。);
(3)定义一个方法,返回该对象,让其他程序可以通过方法就得到本类对象(作用:可控)
3、代码体现:
(1)私有化构造函数;
(2)创建私有并静态的本类对象;
(3)定义公有并静态的方法,返回该对象。
五、代码示例:
1、饿汉式:当类加载的时候,就创建对象。
class Single {private Single(){} //私有化构造函数。private static Single s = new Single(); //创建私有并静态的本类对象。public static Single getInstance() //定义公有并静态的方法,返回该对象。{return s;}}public class SingleDemo{public static void main(String[] args){Single s1 = Single.getInstance();}}
class Single2{private Single2(){}private static Single2 s = null;public static Single2 getInstance(){if(s==null){//线程1就进来了,线程2就进来了。s = new Single2();}return s;}}class SingleDemo2 {public static void main(String[] args) {Single2 s2 = Single2.getInstance();}}
六、单例设计模式在java类中的具体应用:
1、java.lang.Runtime
Runtime类就是单例设计模式进行设计的。
(1)API中说法:每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接。可以通过getRuntime 方法获取当前运行时。
(2)个人理解:Runtime类封装了应用程序的运行环境,每个java程序都有自己的一个Runtime类的实例,但是我们不能够创建这个Runtime的实例对象,这是java程序启动时,自己就存在的。但是我们可以通过获取这个Runtime对象,从而控制java程序的状态。
比如说,我们可以通过获得Runtime实例对象,启动一个程序(如扫雷):
Runtime run = Runtime.getRuntime();Process pro = null;try {pro = run.exec("winmine.exe");} catch (IOException e) {throw new RuntimeException("程序启动失败");}System.out.println(pro.getClass().getName());
2、java.beans.Introspector
(1)API中说法:Introspector 类为通过工具学习有关受目标 Java Bean 支持的属性、事件和方法的知识提供了一个标准方法。
(2)个人理解:称之为内省,是对JavaBean的相关类中属性信息的描述。
(3)为什么需要使用单例模式
属性是系统的一种"资源",应当避免有多余一个的对象读取特别是存储属性。此外,属性的读取可能会在很多地方发生,创建属性对象的地方应当在哪里不是很清楚。换言之,属性管理器应当自己创建自己的实例,并且自己向系统全程提供这一事例。因此,属性文件管理器应当是一个单例模式负责。
代码示例:
//获取全部属性@Test public void test1() throws Exception{BeanInfo bf = Introspector.getBeanInfo(Person.class);//BeanInfo bf = Introspector.getBeanInfo(Person.class, Object.class);//去除父类的属性:Object中的getClassPropertyDescriptor[] pd = bf.getPropertyDescriptors();for(PropertyDescriptor p : pd){System.out.println(p.getName());}}
3、java.net.InetAddress
(1)API中说法:此类表示互联网协议 (IP) 地址。
(2)个人理解:InetAddress是java作为网络编程中很重要的一个类。InetAddress的实例对象包含以数字形式保存的IP地址,同时还可能包含主机名,因此,可通过这个类中的方法获取到指定的IP地址和对应的主机名。由于IP地址是网络分配的,我们不能随便创建其对象,所以使用单例设计模式,在InetAddress类中最为常用的就是getByName(String host)的静态方法,还有比较重要的静态方法:getLocalHost()、getHostName()以及getHostAddress()等。
代码示例:
//获取本机IP地址 InetAddress ia = InetAddress.getLocalHost(); System.out.println(ia.toString()); //通过百度主机名获取其IP地址 InetAddress i = InetAddress.getByName("www.baidu.com"); System.out.println("name:" + i.getHostName()); System.out.println("address:" + i.getHostAddress());
4、一个元素的枚举
个人理解:我们创建枚举类的目的之一就在于避免外部创建其他对象,而只使用我们自己创建的指定的元素(或者说实例对象),因此,当枚举类中只有一个元素的时候,那么此时这个类就可以看成是应用了单例设计模式。另外,枚举类是一个不可被继承的final类,其中的元素都是类的静态常量。
代码示例:
/* * 简单模拟上线人数 * 每个用户都访问同一个资源,即上线人数。 * 所以需要定义为全局对象,只能有唯一的一份。 */public enum EnumDemo {USERONLINE;private int userCounts = 0;public void addUser(){//每个用户上线,就加1}public void delete(){//每个用户下线,就减1}//.......}
- 黑马程序员-之单例设计模式
- 黑马程序员-设计模式之单例设计模式
- 黑马程序员_Java设计模式之单例设计模式
- 黑马程序员_JAVA设计模式之单例模式
- 黑马程序员-java设计模式之单例模式
- 黑马程序员--设计模式之单例模式
- 黑马程序员-23种设计模式之单例模式
- 黑马程序员-Java设计模式之单例模式解析
- 黑马程序员-Java学习笔记之设计模式(单例设计模式,装饰设计模式,模板设计模式)
- 黑马程序员-面向对象之单例设计模式
- 黑马程序员------java学习笔记之单例设计模式
- 黑马程序员 <梦想之旅 > 单例设计模式
- 黑马程序员-基础学习总结之单例设计模式
- 黑马程序员-------Java基础之单例设计模式
- 黑马程序员_设计模式之单例
- 黑马程序员--Java之单例设计模式01
- 黑马程序员Java学习笔记之单例设计模式
- 黑马程序员-JAVA基础之单例设计模式
- StarUML 中如何使用combined fragment
- linux 异步通知fasync
- 在C++的中的成长
- Tomcat服务器开机启动时执行某段程序
- Windows的TCP协议参数
- 黑马程序员-设计模式之单例设计模式
- Database '' is in warm standby. A warm-standby database is read-only.
- iOS开发icon图标设置--Restina支持
- SEH 代码实例
- UML几种类间关系
- MinGW安装和使用总结
- 01.python学习教程之表达式篇
- Android 进程和线程模型
- Android 应用程序签名