单例模式(饿汉式和懒汉式)----目的:保证这个类只创建一个对象
饿汉式和懒汉式区别:
饿汉式一开始就创建一个对象,勤快,但是如果用不到创建的对象,对象就是多余的
懒汉式不用就不创建对象,因为懒得吃屎*.*
package day12;
/*
* 单例模式(饿汉式):
* 1.构造方法私有化,使用private修饰构造方法
* 2.定义一个当前类型的静态变量,并创建对象
* 3.提供公共的获取当前类示例的静态方法
* 缺点:因为在类加载之后对象就创建好了,
* 倘若在别的地方没有用到这个对象的话,这个对象就是多余的
*/
public class Singleton01 {
// 定义一个当前类型的静态变量,并创建对象
private static Singleton01 instance = new Singleton01();
// 构造方法私有化,使用private修饰构造方法,保证当前类在外部无法直接常见该类的对象
private Singleton01() {
}
// 提供公共的获取当前示例的静态方法
public static Singleton01 getInstance() {
return instance;
}
}
---------------------懒汉式-------------------------------
如果懒汉式的条件变为实例化
没有给成员变量的instance赋值
f(instance==null){
Singleton02 instance=new Singleton02();
System.out.println("我走了");
}
*************************************
package day12;
/*单例模式:(懒汉式)
* 1.构造方法私有化
* 2.定义一个用来存放单例对象的静态变量
* 3.提供公共的获取当前类示例的静态方法
* 当前懒汉式的写法是有线程安全问题的
*/
public class Singleton02 {
// 定义一个用来存放单例对象的静态变量
private static Singleton02 instance;
// 构造方法私有化
private Singleton02() {
}
// 提供公共的获取当前类示例的静态方法
public static Singleton02 getInstance() {
// 判断当前静态变量是否为null
if (instance == null) {
instance = new Singleton02();
}
return instance;
}
}
----------------饿汉式和懒汉式测试结果-----------------------
package day12;
public class Test01 {
public static void main(String[] args) {
// ----------饿汉式------------
Singleton01 aSingleton01 = Singleton01.getInstance();
System.out.println(aSingleton01);
Singleton01 b = Singleton01.getInstance();
System.out.println(b);
Singleton01 cSingleton01 = Singleton01.getInstance();
System.out.println(cSingleton01);
// ---------懒汉式--------------
Singleton02 aSingleton02 = Singleton02.getInstance();
System.out.println(aSingleton02);
Singleton02 bSingleton02 = Singleton02.getInstance();
System.out.println(bSingleton02);
Singleton02 cSingleton02 = Singleton02.getInstance();
System.out.println(cSingleton02);
}
}
---------------饿汉式和懒汉式输出结果--------------------
day12.Singleton01@15db9742
day12.Singleton01@15db9742
day12.Singleton01@15db9742
day12.Singleton02@6d06d69c
day12.Singleton02@6d06d69c
day12.Singleton02@6d06d69c
-----------------------单列模式的案例:Runtime-------------------------------------
package day12;
import java.io.IOException;
/*
* 单列模式的案例:Runtime
*/
public class Test02 {
public static void main(String[] args) throws IOException {
Runtime runtime = Runtime.getRuntime();
// runtime.exec("mspaint");
// runtime.exec("notepad");
runtime.exec("calc");
}
}