实现
1,只提供私有的构造方法
2,含有一个该类的静态私有对象
3,提供一个静态的共有方法用于创建,获取静态私有对象。
代码实现方案
1,饿汉式--对象创建过程中实例化
2,懒汉式--静态共有方法中实例化,用到的时候才进行实例化操作。
单例模式的实现必须满足(ACD)个条件。(选择三项)
A类中的构造方法的访问权限必须设置为私有的
B类中的构造方法必须用protected修饰
C必须在类中创建该类的静态私有对象
D在类中提供一个公有的静态方法用于创建、获取静态私有对象
饿汉式:特点,创建对象实例的时候直接初始化。
class SingletonOne {
// 1创建类中私有构造
private SingletonOne() {
}// 外部不能创建该实例
// 2创建该类型的私有静态实例
private static SingletonOne instance = new SingletonOne();
// 3创建共有静态方法,返回静态实例对象。
public static SingletonOne getInstance() {
return instance;
}
}
public class Re {
public static void main(String[] args) {
SingletonOne one = SingletonOne.getInstance();
SingletonOne two = SingletonOne.getInstance();
System.out.println(one);
System.out.println(two);
// 验证结果,两个对象的应用表示相同,验证成功。
// 空间换时间。
}
}
编程练习
某公司研发星球维护系统,请使用饿汉式单例模式的实现思想,设计编写地球类。
程序运行参考效果图如下:
任务
实现步骤:
Earth类
定义私有构造方法,并在构造方法中打印输出“地球诞生”
结合饿汉模式,完成单例对象定义,实例化及静态方法设置
测试类
结合已有输出提示、运行效果图完成对象实例创建及对比(具体对象引用信息不限)
public class Earth {
//定义私有构造方法,并在构造方法中打印输出“地球诞生”
//定义私有静态类对象并完成实例化
//定义公有静态方法返回类内的私有静态对象
}
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("第一个地球创建中。。。。");
System.out.println("第二个地球创建中。。。。");
System.out.println("第三个地球创建中。。。。");
System.out.println("问:三个地球是同一个么?");
}
}
懒汉式:
/**
* 懒汉式:类内实例对象创建时并不直接初始化,
* 直到第一次调用get方法时,才完成初始化操作。
*/
class SingletonTwo {
// 1创建类中私有构造
private SingletonTwo() {}// 外部不能创建该实例
// 2创建该类型的私有静态实例
private static SingletonTwo instance = null;
// 3创建共有静态方法,提供实例对象。
public static SingletonTwo getInstance() {
if(instance == null)
instance = new SingletonTwo();
return instance;
}
}
public class Re {
public static void main(String[] args) {
SingletonTwo one = SingletonTwo.getInstance();
SingletonTwo two = SingletonTwo.getInstance();
System.out.println(one);
System.out.println(two);
// 验证结果,两个对象的应用表示相同,验证成功。
// 时间换空间。
}
}
3-4 编程练习
请使用懒汉式单例模式的实现思想,设计编写皇帝类。
程序运行参考效果图如下:
任务
实现步骤:
Emperor类
1、定义私有构造方法
2、结合懒汉模式,完成单例对象定义,实例化及静态方法设置
测试类
结合注释完成测试单例的皇帝类信息,程序效果参考运行效果图(具体对象引用信息不限)
public class Emperor {
//定义私有构造方法
//定义私有静态类对象
//定义公有静态方法返回类内的私有静态对象
}
public class Test {
public static void main(String[] args) {
System.out.println("创建1号皇帝对象");
System.out.println("创建2号皇帝对象");
System.out.println("创建3号皇帝对象");
System.out.println("三个皇帝对象依次是:");
}
}
-------------------
饿汉式线程安全
懒汉式存在线程风险