Java初级_单例设计模式
单例模式:
要点:
1,某个类只能有一个实例
2,必须自行创建实例
3,必须自行向整个系统提供这个实例。
实现
1,只提供私有的构造方法
2,含有一个该类的静态私有对象
3,提供一个静态的共有方法用于创建,获取静态私有对象。
代码实现方案
1,饿汉式--对象创建过程中实例化
2,懒汉式--静态共有方法中实例化,用到的时候才进行实例化操作。
单例模式的实现必须满足()个条件。
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("三个皇帝对象依次是:"); } }
-------------------
饿汉式线程安全
懒汉式存在线程风险
1. 多选题
下列关于懒汉式和饿汉式的说法错误的是(AB)(选择两项)
A饿汉式在第一次使用时进行实例化
B懒汉式在类加载时就创建实例
C饿汉式的线程是安全的
D懒汉式存在线程风险