• 单例的饥饿、懒汉模式案例


    今天分享一下单例模式的几种写法,以及抽象工厂的实现代码,希望能对你各位大佬有所帮助。

    1. 为什么需要学习设计模式

    设计模式(Design pattern)代表了最佳的实践,是很多优秀的软件开发人员的经验总结,是解决特定问题的解决方案。它并不是语法规定,也不拘泥于特定语言。 恰当的使用设计模式可以代码的可复用性,可维护性,可扩展性,健壮性及安全性,这些都是系统非常重要的非功能性需求。

    2、常见的设计模式

    2.1单例模式

    概念:保证在内存中只用一个实例

    作用:系统配置文件的管理,这些配置文件只要使用一个单例对象进行读写即可,系统总其他地方需要使用配置信息时,只要使用该单例对象进行获取就可以了,这样便于统一管理配置信息。

    优点:

    • 在内存中只有一个对象,节省内存空间;

    • 避免频繁的创建销毁对象,可以提高性能;

    • 避免对共享资源的多重占用,简化访问;

    • 为整个系统提供一个全局访问点。

    缺点:

    • 不适用于变化频繁的对象;

    • 滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;

    案例

    1、饥饿模式

    这种直线方式简单,且是线程安全的。

    1. /**
    2. * 单例模式,饥饿加载
    3. */
    4. public class SingletonDemo {
    5.    //1. 需要有一个私有的构造函数,防止该类通过new的方式创建实例
    6.    private SingletonDemo(){}
    7.    //2. 饥饿模式,首先生成一个实例
    8.    private static final SingletonDemo instance = new SingletonDemo();
    9.    //3. 静态方法,用于获取已经生成的实例
    10.    public static SingletonDemo getInstance() {
    11.        return instance;
    12.   }
    13.    public String hello(String name) {
    14.        return "hello " + name;
    15.   }
    16. }

    2、懒汉模式

    可以保证单例,且线程安全(外部类是单例的;只会执行一次)

    外部类调用静态方法时,只加载外部类;当该静态方法访问内部类的属性时候,才会加载静态内部类的实例。

    第一种写法

    1. /**
    2. * 单例模式: 懒加载, 线程安全
    3. */
    4. public class SingletonDemo04 {
    5.    //阻止外部实例化
    6.    private SingletonDemo04(){
    7.        try {
    8.            Thread.sleep(10);
    9.       } catch (InterruptedException e) {
    10.            e.printStackTrace();
    11.       }
    12.   }
    13.    //使用静态内部类来使用一个SingletonDemo04对象
    14.    private static class SingletonDemoHolder {
    15.        private final static SingletonDemo04 instance = new SingletonDemo04();
    16.   }
    17.    public static SingletonDemo04 getInstance() {
    18.        return SingletonDemoHolder.instance;
    19.   }
    20.    public String hello(String name) {
    21.        return "hello " + name;
    22.   }
    23. }

    第二种写法(枚举型)

    1. public enum  SingletonDemo05 {
    2.    INSTANCE;
    3.    public String hello(String name) {
    4.        return "hello " + name;
    5.   }
    6. }

    2.2工厂模式

    作用

    使用工厂的原因是我们可以通过工厂模式,来集中控制对象的创建过程,这样可以给设计带来更多的灵活性;列spring的IOC容器就是工厂模式的经典实现

    图解

     

    用于生产指定系列的对象。已鸭子为例,鸭子有真的鸭子,橡皮鸭,电子玩具鸭等。如何能方便的创建出各种鸭子,并将创建过程控制起来,以便于以后的维护和扩展?

    2.3抽象工厂

     

    用于生成指定产品族,一个产品族中包括多种产品。例如: 我们都比较熟悉的电脑制造相关行业,有HP,罗技,联想,戴尔,近几年华为,小米也进来了,每个生产商生产的电脑又包括鼠标,键盘,屏幕等等配件。此时我们需要使用工厂模式来进行管理不同的产品族,这时使用简单工厂(也有叫作工厂方法的)已经无法满足要求,此时可以使用抽象工厂

    代码

    PcFactory工厂类

    1. public abstract class PcFactory {
    2.    public abstract Mouse makeMouse();
    3.    public abstract Keyboard makeKeyboard();
    4.    private static HpFactory hpFactory = new HpFactory();
    5.    private static LogicFactory logicFactory = new LogicFactory();
    6.    public final static int PC_TYPE_HP = 1;
    7.    public final static int PC_TYPE_LG = 2;
    8.    public static PcFactory getPcFactory(int pcType) {
    9.        switch (pcType){
    10.            case 1:
    11.                return hpFactory;
    12.            case 2 :
    13.                return logicFactory;
    14.            default:
    15.                return null;
    16.       }
    17.   }

    Mouse类

    1. public abstract class Mouse {
    2.    abstract String getInfo();
    3. }

    Hpkeyboard类

    1. public class HpKeyboard extends Keyboard {
    2.    @Override
    3.    String getInfo() {
    4.        return "HP keyboard";
    5.   }
    6. }

    2.4责任链模式

    作用

    web容器中的过滤器算是责任链模式的一个经典场景。另外举个例子:当在论坛上提交内容时,论坛系统需要对一些关键词进行处理,看看有没有包含一些敏感词汇,而这些敏感词汇我们可以使用责任链模式进行处理。

    2.5 观察者模式(Obsever)

     

    作用

    比较经典的使用场景,比如:java中的swing包中对事件的处理。浏览器对鼠标,键盘等事件的处理等, spring中的事件发布机制也是使用该模式。


  • 相关阅读:
    Volcano成Spark默认batch调度器
    打工人办公环境布置篇
    SpringBoot - HttpSecurity是什么?
    LVGL---对象(lv_obj_t)
    Google SGE 正在添加人工智能图像生成器,现已推出:从搜索中的生成式 AI 中获取灵感的新方法
    线性【SVM】数学原理和算法实现
    秒杀系统常见问题—库存超卖
    Linux相关命令整理
    快速掌握keepalived
    【Linux】之Jumpserver堡垒机添加Windows主机资产
  • 原文地址:https://blog.csdn.net/Bugxiu_fu/article/details/125409986