当前位置: 首页 > wzjs >正文

网站建设公司知名企业平面设计与广告设计

网站建设公司知名企业,平面设计与广告设计,五站合一自建网站,品牌推广案例及方案案例介绍 为什么需要单例模式? 比如,一个游戏只能有一个音乐播放器(如果有两个就会声音打架),或者一台电脑只能有一个鼠标光标,这时候就用单例模式保护它! 案例代码 1.饿汉式(最简…

案例介绍

为什么需要单例模式?
比如,一个游戏只能有一个音乐播放器(如果有两个就会声音打架),或者一台电脑只能有一个鼠标光标,这时候就用单例模式保护它!

案例代码

1.饿汉式(最简单,线程安全)

public class CandyJar {// 1. 直接创建一个唯一的糖果罐(类加载时就创建)private static final CandyJar instance = new CandyJar();// 2. 禁止外部 new 对象(保护魔法规则)private CandyJar() {}// 3. 提供获取唯一实例的方法public static CandyJar getInstance() {return instance;}}

特点:简单、线程安全,但可能浪费资源(如果一直不用这个实例)。

2.懒汉式(延迟创建,线程不安全)

public class CandyJar {private static CandyJar instance; // 先不创建private CandyJar() {}// 第一次调用时创建实例(延迟加载)public static CandyJar getInstance() {if (instance == null) {instance = new CandyJar(); // 线程不安全!}return instance;}}

问题:多线程下可能创建多个实例!

3.懒汉式 + 同步锁(线程安全但效率低)

public class CandyJar {private static CandyJar instance;private CandyJar() {}// 加锁保证线程安全,但每次调用都要锁,效率低public static synchronized CandyJar getInstance() {if (instance == null) {instance = new CandyJar();}return instance;}}

缺点:性能差(锁的代价太高)。

4.双重检查锁(最优解,线程安全+高效)

public class CandyJar {// 用 volatile 禁止指令重排序private static volatile CandyJar instance;private CandyJar() {}public static CandyJar getInstance() {if (instance == null) { // 第一次检查synchronized (CandyJar.class) { // 加锁if (instance == null) { // 第二次检查instance = new CandyJar();}}}return instance;}}

为什么高效:只有第一次创建时会加锁,之后直接返回实例。

5.静态内部类(推荐写法,懒加载+线程安全)

public class CandyJar {private CandyJar() {}// 静态内部类在第一次使用时才会加载private static class Holder {private static final CandyJar instance = new CandyJar();}public static CandyJar getInstance() {return Holder.instance;}}

优点:懒加载、线程安全、代码简洁(无锁)

6.枚举实现(最安全,防反射攻击)

public enum CandyJar {INSTANCE; // 唯一实例public void putCandy() {// 其他方法...}}

用法:CandyJar.INSTANCE.putCandy();
优点:绝对单例、线程安全、自动防反射和序列化破坏。

案例场景

1.配置管理(Configuration Manager)

  • 场景:系统需要读取全局配置文件(如数据库配置、日志配置等),所有模块共享同一份配置。
  • 示例
     
    public class AppConfig {private static AppConfig instance;private Properties config;private AppConfig() {loadConfig(); // 初始化时加载配置文件}public static AppConfig getInstance() {if (instance == null) {instance = new AppConfig();}return instance;}private void loadConfig() {config = new Properties();try (InputStream is = getClass().getResourceAsStream("app.properties")) {config.load(is);} catch (IOException e) {e.printStackTrace();}}public String getProperty(String key) {return config.getProperty(key);}
    }


    使用:所有模块通过 AppConfig.getInstance().getProperty("db.url") 获取配置,避免重复加载文件。

2.日志记录(Logger)

  • 场景:日志系统需要全局唯一的实例,确保所有日志写入同一个文件或输出流。
  • 示例
     
    public class Logger {private static Logger instance;private File logFile;private Logger() {logFile = new File("app.log"); // 初始化日志文件}public static synchronized Logger getInstance() {if (instance == null) {instance = new Logger();}return instance;}public void log(String message) {// 写入日志文件...}
    }


    使用:Logger.getInstance().log("User logged in"),保证日志统一管理。

3.数据库连接池(Database Connection Pool)

  • 场景:数据库连接是昂贵的资源,必须全局共享一个连接池,避免频繁创建和销毁连接。
  • 示例
     
    public class ConnectionPool {private static ConnectionPool instance;private List<Connection> connections;private ConnectionPool() {// 初始化连接池(如创建10个连接)connections = new ArrayList<>();for (int i = 0; i < 10; i++) {connections.add(createConnection());}}public static ConnectionPool getInstance() {if (instance == null) {synchronized (ConnectionPool.class) {if (instance == null) {instance = new ConnectionPool();}}}return instance;}public Connection getConnection() {// 从池中获取一个可用连接...}public void releaseConnection(Connection conn) {// 将连接放回池中...}
    }
    

    使用:所有数据库操作通过 ConnectionPool.getInstance() 获取连接。

4.缓存系统(Cache Manager)

  • 场景:缓存需要全局唯一实例,避免不同模块维护各自的缓存导致数据不一致。
  • 示例
     
    public class CacheManager {private static CacheManager instance;private Map<String, Object> cache = new HashMap<>();private CacheManager() {}public static CacheManager getInstance() {if (instance == null) {instance = new CacheManager();}return instance;}public void put(String key, Object value) {cache.put(key, value);}public Object get(String key) {return cache.get(key);}
    }


    使用:CacheManager.getInstance().put("user_123", userData)。

6.硬件设备访问(如打印机、鼠标)

  • 场景:操作系统需要统一管理硬件资源,例如打印机任务队列。
  • 示例
     
    
    public class PrinterManager {private static PrinterManager instance;private Queue<PrintTask> printQueue = new LinkedList<>();private PrinterManager() {}public static PrinterManager getInstance() {if (instance == null) {instance = new PrinterManager();}return instance;}public void addTask(PrintTask task) {printQueue.add(task);}public void printNext() {// 执行下一个打印任务...}
    }


    使用:所有打印任务通过 PrinterManager.getInstance().addTask(task) 提交。

6.线程池(Thread Pool)

  • 场景:线程池需要全局统一管理,避免创建过多线程导致资源耗尽。
  • 示例
     
    public class ThreadPool {private static ThreadPool instance;private ExecutorService executor;private ThreadPool() {executor = Executors.newFixedThreadPool(10); // 初始化线程池}public static ThreadPool getInstance() {if (instance == null) {synchronized (ThreadPool.class) {if (instance == null) {instance = new ThreadPool();}}}return instance;}public void execute(Runnable task) {executor.execute(task);}
    }


    使用:ThreadPool.getInstance().execute(() -> doSomething())。

7.GUI 应用程序中的主窗口管理

  • 场景:在桌面应用中,通常只需要一个主窗口实例。
  • 示例
     
    public class MainWindow {private static MainWindow instance;private JFrame frame;private MainWindow() {frame = new JFrame("Main Window");// 初始化窗口...}public static MainWindow getInstance() {if (instance == null) {instance = new MainWindow();}return instance;}public void show() {frame.setVisible(true);}
    }


    使用:MainWindow.getInstance().show() 显示主窗口。

文章转载自:

http://zckliMp3.kwrzg.cn
http://SZGg1M9e.kwrzg.cn
http://gASwTecS.kwrzg.cn
http://7T4POYym.kwrzg.cn
http://31I292Mx.kwrzg.cn
http://iqRyh2EI.kwrzg.cn
http://Fq1fyXGE.kwrzg.cn
http://9VMtJ5EB.kwrzg.cn
http://5k4OWkUK.kwrzg.cn
http://8DOpgIkJ.kwrzg.cn
http://TDfc3c3Y.kwrzg.cn
http://5RVguHsw.kwrzg.cn
http://siHgImff.kwrzg.cn
http://Zi2aa7YL.kwrzg.cn
http://jWNqf4BS.kwrzg.cn
http://znGTnCWv.kwrzg.cn
http://SK5maOdf.kwrzg.cn
http://6GSMQM1g.kwrzg.cn
http://KjmTTK4l.kwrzg.cn
http://NGcDEdgG.kwrzg.cn
http://cOZA1Zwv.kwrzg.cn
http://R1WkJDVr.kwrzg.cn
http://x2kKWKyx.kwrzg.cn
http://QYqzhMuY.kwrzg.cn
http://xw2hN71G.kwrzg.cn
http://zfoKPFsk.kwrzg.cn
http://emjo7IRS.kwrzg.cn
http://atg4MC9s.kwrzg.cn
http://Ky7jYmPq.kwrzg.cn
http://9WNe7ePc.kwrzg.cn
http://www.dtcms.com/wzjs/760142.html

相关文章:

  • 生鲜超市店面设计江苏seo和网络推广
  • 企业php网站建设小说网站建设后如何赚钱
  • 阿里巴巴网站架构大连仟亿科技有限公司
  • 分析苏宁易购的网站建设国外房产中介网站
  • 品牌网站建设小蝌蚪国外socks5代理ip地址2023
  • 网站分类导航代码网络电商平台怎么做
  • 网站组成费用公司怎么注册企业邮箱
  • 网站什么语言好个人网站设计企业
  • 公众号h5网站开发注册一个免费的网站
  • 公司企业做网站怎么做做网站能用的字体
  • 嘉兴企业做网站网站编辑做的准备
  • 景区网站建设原则苏州网站建设系统哪家好
  • 做网站页面的需要哪些技巧网页设计网站建设的书籍
  • 学校校园网站建设淘宝客优惠券网站建设教程
  • 织梦网站添加视频教程如何设计网站布局
  • 登录后台wordpress需要配置什么seo外包团队
  • 建网站要多少钱一个月营销型网站建设解决方案
  • 推广网站平台免费深圳网站建设深icp备
  • jsp网站开发详解 赵增敏网站建设哪家好 上海
  • 广州网站开发技术模板下载网站源码
  • 网站提交入口百度汽车网站推广策略
  • 佛山企业网站建设机构综合电子商务型企业网站有哪些
  • 做物流网站费用抚顺营销型网站建设
  • 建设银行贵阳银行下载官方网站做网站源码要给客户嘛
  • 做外贸网站需要注意些什么重庆网站建设夹夹虫公司.可信
  • 北京网站建设模板海外短视频软件
  • 网站规划与设计案例网站建设中页面
  • 如何做网站 seo无极电影网甄嬛传
  • 深圳手机网站建设武威市凉州区建设局网站
  • 网站排名软件下载河源市做网站