4.5 设计模式
Java中有23 种设计模式,本质是面向对象设计原则的实际运用,是对类的封装性、继承性和多态性,以及类的关联关系和组合关系的充分理解。
当然,软件设计模式只是一个引导,在实际的软件开发中,必须根据具体的需求来选择。
1、 对于简单的程序,可能写一个简单的算法要比引入某种设计模式更加容易。
2、 但是对于大型项目开发或者框架设计,用设计模式来组织代码显然更好。
4.5.1 单例设计模式概念
单例模式可以说是大多数开发人员在实际中使用最多的,常见的Spring默认创建的bean就是单例模式的。
单例模式有很多好处,比如可节约系统内存空间,控制资源的使用。
其中单例模式最重要的是确保对象只有一个。
简单来说,保证一个类在内存中的对象就一个。
RunTime就是典型的单例设计,我们通过对RunTime类的分析,一窥究竟。
4.5.2 源码剖析
/**
* Every Java application has a single instance of class
* <code>Runtime</code> that allows the application to interface with
* the environment in which the application is running. The current
* runtime can be obtained from the <code>getRuntime</code> method.
* <p>
* An application cannot create its own instance of this class.
*
* @author unascribed
* @see java.lang.Runtime#getRuntime()
* @since JDK1.0
*/
RunTime.java
package java.lang;
public class Runtime {
//1、创建静态的全局唯一的对象
private static Runtime currentRuntime = new Runtime();
//2、私有构造方法,
/** Don't let anyone else instantiate this class */
private Runtime() {
}
//3、通过自定义的静态方法获取实例
public static Runtime getRuntime() {
return currentRuntime;
}
}
4.5.3 饿汉式
目的:控制外界创建对象的个数只能创建1个对象
开发步骤:
1、 私有化构造方法
2、 在类的内部创建好对象
3、 对外界提供一个公共的get(),返回一个已经准备好的对象
class Person{
/**
* 实现单例模式
*
* 饿汉式-------简单,框架底层用
* 1:私有化改造方法 -- 目的就是控制外界创建对象的权利
* 2:自己new一个给外界准备的对象,且私有化
* 3:提供一个方法返回自己new的对象给外界用
*/
/**
* 因为我是在static方法中去返回的对象,所以我的被返回的成员数据也得是static
*/
private static Person p = new Person();
private static Object obj;
private Person(){
}
/**
* 加static,getPerson不能通过对象调用,而是只能用类名去调用,避免了很多不必要的麻烦
* @return 此类对外界共享的,唯一的对象
*/
public static Person getPerson() {
synchronized(obj) {
return p;
}
}
}
4.5.4 懒汉式
class PersonOne{
/**
* 实现单例模式
*
* 懒汉式----按需加载的思想---线程安全的解决方案
* 1:私有化改造方法 -- 目的就是控制外界创建对象的权利
* 2:封装创建好的对象 -- 先不创建对象,啥时候用啥时候创建!!
* 3:提供公的获取对象的方法
*/
/**
* 给外界声明一个对象
*/
private static PersonOne p;
private PersonOne(){
}
/**
* 给外界返回p----按需加载
* @return new好的p对象
*/
synchronized public static PersonOne getPersonOne(){
//静态资源的锁对象必须是类名.class
// synchronized (PersonOne.class) {
//限制若我的p没有被new过就是空的
if (p == null) {
p = new PersonOne();
}
return p;
// }
}
}