编写一个单例模式

目录

单例模式的要点:

单例模式的实现:        

饿汉式

懒汉式

测试懒汉式和饿汉式的单例模式

测试结果:

分析懒汉式和饿汉式的优劣:    

分析单例模式的优劣:

单例模式的使用场景:

其他模式


单例模式的要点:

 
 1、某个类只能有一个实例
 2、必须自行创建实例
 3、提供一个静态的公有方法用提供这个实例

单例模式的实现:
        

1、只提供私有的构造方法
2、含有一个该类的静态私有对象
3、必须自行向整个系统于创建、获取静态私有对象

        

单例模式分为两种,即饿汉式和懒汉式。

饿汉式

public class SingletonLazy {
// 饿汉式
    //1、创建类中私有构造
    private SingletonLazy() {}

    //2、创建该类型的私有静态实例
    private static SingletonLazy instance = new SingletonLazy();

    //3、创建公有静态方法返回静态实例对象
    public static SingletonLazy getInstance() {
        return instance;
    }

}

懒汉式

// 懒汉式;类内实例对象创建时并不直接初始化,
//        直到第一次调用getInstance方法时,才完成初始化操作。
public class SingletonHungry {
// 懒汉式
    //1、创建私有构造方法
    private SingletonHungry() {}

    //2、创建静态的该类实例对象
    private static SingletonHungry instance = null; // 不用空间就不会产生损耗;

    //3、创建开放的静态方法提供实例对象
    public static SingletonHungry getInstance() {
        if (instance == null)
            instance = new SingletonHungry();
        return instance;
    }
}

测试懒汉式和饿汉式的单例模式

public class SingletonTest {
    public static void main(String[] args) {
        // 测试饿汉式
            // 获取单例懒汉式的实例
        SingletonLazy lazyInstance = SingletonLazy.getInstance();
        SingletonLazy lazyInstance1 = SingletonLazy.getInstance();
            // 打印地址信息,如果两者地址信息一致,则测试成功.
        System.out.println(lazyInstance);
        System.out.println(lazyInstance1);
        
        System.out.println("我是不重要的分割线=====================");
        
        // 测试懒汉式
            // 获取单例饿汉式的实例
        SingletonHungry hungryInstance = SingletonHungry.getInstance();
        SingletonHungry hungryInstance2 = SingletonHungry.getInstance();
            // 打印地址信息,如果两者地址信息一致,则测试成功.
        System.out.println(hungryInstance);
        System.out.println(hungryInstance2);
    }
}

测试结果:

example.singleton.SingletonLazy@5caf905d
example.singleton.SingletonLazy@5caf905d
我是不重要的分割线=====================
example.singleton.SingletonHungry@27716f4
example.singleton.SingletonHungry@27716f4

         

        可以看到以上的地址信息式包名加类名再加上at符号和一串16进制数字组成,运行结果是正确的。

分析懒汉式和饿汉式的优劣:    

* 饿汉式,空间换时间;懒汉式,时间换空间;
* 饿汉式线程安全,空间换时间,第一次运行块;
* 懒汉式存在线程风险,时间换空间,第一次运行慢;
*当多个线程并发操作,由于饿汉式在类加载时对象就被实例化创建,
 线程的访问对象都是唯一的。所以线程安全。
* 而懒汉式由于线程的时间片切换,存在线程风险。

分析单例模式的优劣

* 优点:
* 1、在内存中只有一个对象,节省内存空间;
* 2、避免频繁的创建销毁对象,提高性能;
* 3、避免对共享资源的多重占用;
* 缺点:
* 1、扩展比较困难;
* 2、如果实例化后的对象长期不利用,系统将默认为垃圾进行回收,造成对象状态丢失;

单例模式的使用场景:

* 1、创建对象时占用资源过多,但同时又需要用到该类对象;
* 2、对系统内资源要求统一读写,如读写配置信息;
* 3、当多个实例存在可能引起程序逻辑错误,如号码生成器;

其他模式

创建型模式:关注对象创建过程的的设计模式;
结构型模式:关注类和对象组合的设计模式;
行为型模式:关注对象间的通信过程的设计模式;

创建型模式
结构型模式
行为型模式
工厂方法模式
桥接模式
装饰器模式
备忘录模式
状态模式
建造者模式
代理模式
组合模式
解释器模式
模板方法模式
抽象工厂模式
享元模式
命令模式
适配器模式
访问者模式
原型模式
外观模式
中介者模式
迭代子模式
单例模式
观察者模式
责任链模式
策略模式

引用请注明出处,谢谢!

        

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值