Java初级_单例设计模式

单例模式:
要点:
1,某个类只能有一个实例
2,必须自行创建实例
3,必须自行向整个系统提供这个实例。

实现
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("三个皇帝对象依次是:");
    }
}

-------------------

饿汉式线程安全

懒汉式存在线程风险

1. 多选题
下列关于懒汉式和饿汉式的说法错误的是(AB)(选择两项)
A饿汉式在第一次使用时进行实例化
B懒汉式在类加载时就创建实例
C饿汉式的线程是安全的
D懒汉式存在线程风险

原文地址:https://www.cnblogs.com/haizinihao/p/14706415.html