<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[想起来就更新]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/qq_44711486</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; qq_44711486]]></copyright><item><title><![CDATA[56 | 观察者模式（上）：详解各种应用场景下观察者模式的不同实现方式]]></title><link>https://blog.youkuaiyun.com/qq_44711486/article/details/143052175</link><guid>https://blog.youkuaiyun.com/qq_44711486/article/details/143052175</guid><author>qq_44711486</author><pubDate>Mon, 18 Nov 2024 15:59:11 +0800</pubDate><description><![CDATA[观察者模式是一种行为型设计模式，用于处理对象之间的交互。它建立了一对多的依赖关系，当一个对象状态发生变化时，所有依赖它的对象都会自动收到通知。本文详细介绍了观察者模式的原理、实现方式和应用场景。观察者模式因其灵活性和可扩展性，广泛应用于实际开发中。文章讨论了同步阻塞和异步非阻塞的实现方式，以及在进程内和跨进程的应用。此外，观察者模式常用于邮件订阅、RSS订阅和基于消息队列的系统中，帮助实现代码和系统的解耦，提升架构设计的灵活性。]]></description><category></category></item><item><title><![CDATA[55 | 享元模式（下）：剖析享元模式在Java Integer、String中的应用]]></title><link>https://blog.youkuaiyun.com/qq_44711486/article/details/142878097</link><guid>https://blog.youkuaiyun.com/qq_44711486/article/details/142878097</guid><author>qq_44711486</author><pubDate>Fri, 18 Oct 2024 11:07:10 +0800</pubDate><description><![CDATA[本文讨论了享元模式在Java中的实际应用，尤其是在Integer和String类中的体现。通过缓存常用的对象，Integer类在-128到127范围内避免了频繁创建新对象，提升了内存效率；而String类通过字符串常量池实现了相同字符串的复用，减少了内存占用。然而，享元模式对垃圾回收不友好，享元对象在没有使用时可能无法被及时回收。文章建议开发者在实际项目中合理使用享元模式，避免过度使用，尤其在确保其能带来显著内存优化的场景下。最后，文章还提出了一些改进思路，帮助更好地管理和回收不再使用的享元对象。]]></description><category></category></item><item><title><![CDATA[54 | 享元模式（上）：如何利用享元模式优化文本编辑器的内存占用？]]></title><link>https://blog.youkuaiyun.com/qq_44711486/article/details/142877984</link><guid>https://blog.youkuaiyun.com/qq_44711486/article/details/142877984</guid><author>qq_44711486</author><pubDate>Fri, 18 Oct 2024 11:05:35 +0800</pubDate><description><![CDATA[本文详细介绍了享元模式的原理和实现，重点通过棋牌游戏和文本编辑器的例子展示了该模式在内存优化中的应用。享元模式通过复用对象，减少内存消耗，适用于大量重复对象的场景。在棋牌游戏中，享元模式通过共享棋子的属性信息，实现棋盘内存优化；在文本编辑器中，享元模式用于复用相同的字体格式，从而节省内存。文章还对享元模式与单例、缓存、对象池等概念进行了对比，帮助读者更好地理解其独特性与应用场景。总体而言，本文为开发人员提供了在实际开发中使用享元模式进行内存优化的实用参考。]]></description><category></category></item><item><title><![CDATA[53 | 组合模式：如何设计实现支持递归遍历的文件系统目录树结构？]]></title><link>https://blog.youkuaiyun.com/qq_44711486/article/details/142877875</link><guid>https://blog.youkuaiyun.com/qq_44711486/article/details/142877875</guid><author>qq_44711486</author><pubDate>Wed, 16 Oct 2024 10:21:31 +0800</pubDate><description><![CDATA[本文介绍了组合模式的原理及其在文件系统中的应用。组合模式是一种结构型设计模式，它允许将对象组合成树形结构，从而统一处理单个对象和组合对象的逻辑。文章以文件系统为例，展示了如何通过组合模式设计文件和目录类，利用递归遍历实现统计文件数量和大小的功能。此外，还提到了组合模式在OA系统中部门与员工管理中的应用场景。文章通过具体案例说明了组合模式的优势，特别是在处理具有层次结构的复杂系统时。最后，文章提出了优化递归统计函数执行效率的思考点，鼓励读者进一步探索。]]></description><category></category></item><item><title><![CDATA[52 | 门面模式：如何设计合理的接口粒度以兼顾接口的易用性和通用性？]]></title><link>https://blog.youkuaiyun.com/qq_44711486/article/details/142877781</link><guid>https://blog.youkuaiyun.com/qq_44711486/article/details/142877781</guid><author>qq_44711486</author><pubDate>Wed, 16 Oct 2024 10:21:01 +0800</pubDate><description><![CDATA[门面模式是一种重要的设计模式，旨在提供统一的接口，简化子系统的使用。通过封装系统底层实现，该模式能够隐藏复杂性，提供更易用的接口，解决易用性和性能问题。此外，门面模式还可用于设计新接口，实现多个操作在一个事务中执行，解决分布式事务问题。文章强调了接口设计的重要性，指出接口粒度设计需权衡可复用性和易用性，允许提供冗余的门面接口来提供更易用的接口。总的来说，门面模式在接口设计和系统优化中具有重要作用，能够帮助开发者解决多方面的技术挑战。]]></description><category></category></item><item><title><![CDATA[51 | 适配器模式：代理、适配器、桥接、装饰，这四个模式有何区别？]]></title><link>https://blog.youkuaiyun.com/qq_44711486/article/details/142877565</link><guid>https://blog.youkuaiyun.com/qq_44711486/article/details/142877565</guid><author>qq_44711486</author><pubDate>Tue, 15 Oct 2024 10:45:25 +0800</pubDate><description><![CDATA[适配器模式是一种结构型设计模式，主要用于解决接口不兼容的问题。本文详细介绍了适配器模式的两种实现方式——类适配器和对象适配器，并分析了其应用场景，如封装有缺陷的接口设计、统一不同类的接口、替换外部系统依赖等。通过Java日志系统中的应用示例，文章展示了适配器模式如何提高代码的灵活性和可维护性。除此之外，本文还对比了适配器、代理、桥接、装饰器模式，帮助读者更好地理解这些模式的区别及适用场景。整体而言，适配器模式在解决接口兼容性问题中具有重要作用，是开发者提升代码扩展性的重要工具。]]></description><category></category></item><item><title><![CDATA[50 | 装饰器模式：通过剖析Java IO类库源码学习装饰器模式]]></title><link>https://blog.youkuaiyun.com/qq_44711486/article/details/142877383</link><guid>https://blog.youkuaiyun.com/qq_44711486/article/details/142877383</guid><author>qq_44711486</author><pubDate>Tue, 15 Oct 2024 10:44:24 +0800</pubDate><description><![CDATA[本文通过剖析Java IO类库源码，详细介绍了装饰器模式的设计思想和应用场景。文章首先解释了Java IO类库的复杂性及其在基于继承设计中的问题，随后引入装饰器模式作为解决方案。装饰器模式通过组合替代继承，允许动态地为原始类添加增强功能，且支持多个装饰器的嵌套使用。文章还比较了装饰器模式和代理模式，强调装饰器专注于与原始类相关的功能增强。通过分析Java IO中的装饰器类实现，如FilterInputStream的继承方式，文章帮助读者深入理解了装饰器模式的实用性及其在实际开发中的作用。






]]></description><category></category></item><item><title><![CDATA[49 | 桥接模式：如何实现支持不同类型和渠道的消息推送系统？]]></title><link>https://blog.youkuaiyun.com/qq_44711486/article/details/142877229</link><guid>https://blog.youkuaiyun.com/qq_44711486/article/details/142877229</guid><author>qq_44711486</author><pubDate>Mon, 14 Oct 2024 10:06:01 +0800</pubDate><description><![CDATA[桥接模式是一种结构型设计模式，旨在将抽象与实现解耦，使它们可以独立演化。本文通过JDBC驱动和API接口监控告警的例子，深入阐述了桥接模式的应用场景。文章重点解释了桥接模式的原理及其在实际开发中的两种理解方式。在第二种方式中，通过组合关系将不同渠道的消息发送逻辑独立出来，创建专门的消息发送类，避免了类结构的复杂性。桥接模式的核心在于灵活性，它能够有效减少代码耦合，读者应重点掌握其原理及实际应用，以优化系统设计。]]></description><category></category></item><item><title><![CDATA[48 | 代理模式：代理在RPC、缓存、监控等场景中的应用]]></title><link>https://blog.youkuaiyun.com/qq_44711486/article/details/142877100</link><guid>https://blog.youkuaiyun.com/qq_44711486/article/details/142877100</guid><author>qq_44711486</author><pubDate>Mon, 14 Oct 2024 10:05:23 +0800</pubDate><description><![CDATA[本文介绍了代理模式及其应用。代理模式通过引入代理类，在不修改原始类的情况下附加功能，从而实现业务代码与框架代码的解耦。文章以性能计数器为例，展示了如何利用代理模式优化系统设计。此外，还详细讲解了动态代理的原理，通过动态生成代理类，避免了手动编写多个代理类的繁琐工作。代理模式常用于处理非功能性需求，如日志记录、监控、鉴权、缓存等，在RPC调用和性能优化等领域也广泛应用。通过代理模式，开发者可以更好地分离业务逻辑与附加功能，提升代码的扩展性和可维护性。]]></description><category></category></item><item><title><![CDATA[47 | 原型模式：如何最快速地clone一个HashMap散列表？]]></title><link>https://blog.youkuaiyun.com/qq_44711486/article/details/142793123</link><guid>https://blog.youkuaiyun.com/qq_44711486/article/details/142793123</guid><author>qq_44711486</author><pubDate>Sun, 13 Oct 2024 21:48:08 +0800</pubDate><description><![CDATA[本文深入介绍了原型模式的应用场景和两种实现方式：深拷贝和浅拷贝。通过一个HashMap散列表的例子，生动阐述了对象创建成本较高且差异不大时，利用原型模式可以节省创建时间的优势。文章重点讲解了深拷贝和浅拷贝的区别，以及在实际应用中需要注意对象的引用关系。此外，还提出了两种深拷贝的实现方法，并探讨了在特定应用场景下如何选择合适的拷贝方式。总的来说，本文内容丰富，对于开发人员快速了解原型模式具有一定的参考价值。]]></description><category></category></item><item><title><![CDATA[46 | 建造者模式：详解构造函数、set方法、建造者模式三种对象创建方式]]></title><link>https://blog.youkuaiyun.com/qq_44711486/article/details/142793045</link><guid>https://blog.youkuaiyun.com/qq_44711486/article/details/142793045</guid><author>qq_44711486</author><pubDate>Sun, 13 Oct 2024 21:47:33 +0800</pubDate><description><![CDATA[本文深入探讨了构造函数、set方法和建造者模式三种对象创建方式，并阐述了它们的优劣势及适用场景。通过资源池配置类的例子引出了建造者模式的应用场景，分析了构造函数和set方法可能存在的问题，并指出了建造者模式的优势，如避免无效状态、集中校验逻辑、创建不可变对象等。文章还对比了工厂模式和建造者模式的区别，强调了理解模式设计的本质和灵活应用的重要性。总之，本文内容简洁明了，对于读者快速了解建造者模式的概念和使用具有很高的参考价值。
]]></description><category></category></item><item><title><![CDATA[45 | 工厂模式（下）：如何设计实现一个Dependency Injection框架？]]></title><link>https://blog.youkuaiyun.com/qq_44711486/article/details/142788996</link><guid>https://blog.youkuaiyun.com/qq_44711486/article/details/142788996</guid><author>qq_44711486</author><pubDate>Sat, 12 Oct 2024 09:11:58 +0800</pubDate><description><![CDATA[本文深入探讨了依赖注入（DI）容器的设计原理和实现方法。首先，比较了工厂模式与DI容器的差异，指出DI容器相当于一个大型工厂类，负责整个应用中类对象的创建、配置解析及生命周期管理。接着，详细介绍了DI容器的核心功能：配置解析、对象创建与生命周期管理。文章还介绍了实现简单DI容器的步骤，包括原型设计、执行入口和配置文件解析，并通过示例代码展示了其使用方式与执行流程。重点分析了BeansFactory类的createBean()函数及循环依赖问题，提供了相应解决方案。本文对DI容器的底层原理提供了重要参考。]]></description><category></category></item><item><title><![CDATA[44 | 工厂模式（上）：我为什么说没事不要随便用工厂模式创建对象？]]></title><link>https://blog.youkuaiyun.com/qq_44711486/article/details/142788829</link><guid>https://blog.youkuaiyun.com/qq_44711486/article/details/142788829</guid><author>qq_44711486</author><pubDate>Sat, 12 Oct 2024 09:11:40 +0800</pubDate><description><![CDATA[本文介绍了工厂模式的三种常见类型：简单工厂、工厂方法和抽象工厂，重点分析了简单工厂和工厂方法。简单工厂通过一个工厂类创建不同对象，提升了代码的可读性和灵活性；而工厂方法模式则将对象创建延迟到子类中，更符合开闭原则。文章还探讨了简单工厂的两种实现方法及其对开闭原则和多态的影响，指出工厂方法更符合开闭原则，但在某些场景下，简单工厂更为合适。抽象工厂模式适用于有多种分类方式的复杂场景，能够减少工厂类数量。通过代码示例和对比分析，文章帮助读者理解工厂模式的应用场景和选择原则。]]></description><category></category></item><item><title><![CDATA[43 | 单例模式（下）：如何设计实现一个集群环境下的分布式单例模式？]]></title><link>https://blog.youkuaiyun.com/qq_44711486/article/details/142788205</link><guid>https://blog.youkuaiyun.com/qq_44711486/article/details/142788205</guid><author>qq_44711486</author><pubDate>Fri, 11 Oct 2024 11:06:26 +0800</pubDate><description><![CDATA[本文深入探讨了单例模式在集群环境中的设计与实现。首先，强调了单例模式的唯一性范围，包括进程内唯一和线程内唯一。文章详细介绍了线程唯一单例的实现，通过使用HashMap和ThreadLocal来确保线程内单例对象的唯一性。在集群环境中，单例对象需要序列化并存储在外部共享存储区，并利用分布式锁保证进程间只有一个实例。此外，文章还介绍了多例模式的实现，如限制实例数量和基于类型创建多个实例的方式。这些设计对于开发分布式系统的工程师具有重要的参考价值。]]></description><category></category></item><item><title><![CDATA[42 | 单例模式（中）：我为什么不推荐使用单例模式？又有何替代方案？]]></title><link>https://blog.youkuaiyun.com/qq_44711486/article/details/142787887</link><guid>https://blog.youkuaiyun.com/qq_44711486/article/details/142787887</guid><author>qq_44711486</author><pubDate>Fri, 11 Oct 2024 10:55:31 +0800</pubDate><description><![CDATA[单例模式虽然常用，但存在一些问题，因此有人认为它是一种反模式。首先，单例模式不支持面向对象编程的抽象、继承和多态原则，限制了代码的扩展性。其次，它隐藏了类之间的依赖关系，降低了代码的可读性和可测试性。文章提出了几种替代方案，如使用静态方法、通过init()传参、在getInstance()中传参或使用全局变量。这些方法虽然部分解决了单例模式的不足，但根本上可通过工厂模式或依赖注入（IOC）容器来实现更好的全局管理。合理使用单例模式是关键，文章还探讨了重构以提升代码可测试性的思路。]]></description><category></category></item><item><title><![CDATA[41 | 单例模式（上）：为什么说支持懒加载的双重检测不比饿汉式更优？]]></title><link>https://blog.youkuaiyun.com/qq_44711486/article/details/142787089</link><guid>https://blog.youkuaiyun.com/qq_44711486/article/details/142787089</guid><author>qq_44711486</author><pubDate>Thu, 10 Oct 2024 10:26:44 +0800</pubDate><description><![CDATA[本文详细介绍了单例模式的应用与实现，解释了其确保一个类只能创建一个实例的特点。文章首先阐述了单例模式的必要性，通过实际案例展示了其在多线程环境中避免资源冲突的问题，例如在Logger类中，单例模式有效防止了多线程访问冲突。此外，IdGenerator类的例子展示了单例模式在全局唯一类中的应用。文章进一步讲解了单例模式的实现方法，包括饿汉式、懒汉式、双重检测、静态内部类和枚举，并分析了每种方式的优缺点及适用场景。通过实例和详细解释，本文帮助读者理解如何在实际开发中灵活应用单例模式，具有较高的指导价值。]]></description><category></category></item><item><title><![CDATA[40 | 运用学过的设计原则和思想完善之前讲的性能计数器项目（下）]]></title><link>https://blog.youkuaiyun.com/qq_44711486/article/details/142786414</link><guid>https://blog.youkuaiyun.com/qq_44711486/article/details/142786414</guid><author>qq_44711486</author><pubDate>Thu, 10 Oct 2024 10:26:16 +0800</pubDate><description><![CDATA[本文探讨了通过设计原则优化性能计数器项目的过程。首先，针对ConsoleReporter和EmailReporter的代码重复问题，通过重构提高了可测试性，特别是优化了EmailReporter的时间计算逻辑。文章还完善了功能需求，包括统计信息的接口设计、显示格式、终端设置及统计触发方式和时间区间的管理。最后，提出了版本3中待实现的功能，如被动触发统计、自定义终端和显示格式的设计。本文通过代码示例和分析，展示了如何运用设计原则改进项目，提升了性能、扩展性和容错性。]]></description><category></category></item><item><title><![CDATA[39 | 运用学过的设计原则和思想完善之前讲的性能计数器项目（上）]]></title><link>https://blog.youkuaiyun.com/qq_44711486/article/details/142763137</link><guid>https://blog.youkuaiyun.com/qq_44711486/article/details/142763137</guid><author>qq_44711486</author><pubDate>Wed, 09 Oct 2024 14:35:20 +0800</pubDate><description><![CDATA[本文介绍了通过重构和设计原则改进性能计数器项目的过程。作者回顾了项目第一个版本中Aggregator类和ConsoleReporter、EmailReporter类的问题，并在版本2中通过重构解决了这些设计缺陷。Aggregator类的重构提高了代码的可读性和可维护性，而ConsoleReporter和EmailReporter类的优化解决了代码重复、职责不单一和可测试性差的问题。通过这些改进，项目功能更加完善，满足了设计需求。本文以项目迭代为线索，展示了如何运用设计原则提升代码质量，具有较高的参考价值。]]></description><category></category></item><item><title><![CDATA[38 | 总结回顾面向对象、设计原则、编程规范、重构技巧等知识点]]></title><link>https://blog.youkuaiyun.com/qq_44711486/article/details/142752814</link><guid>https://blog.youkuaiyun.com/qq_44711486/article/details/142752814</guid><author>qq_44711486</author><pubDate>Wed, 09 Oct 2024 14:33:14 +0800</pubDate><description><![CDATA[本文系统介绍了面向对象编程的核心概念，包括四大特性、与面向过程的对比以及面向对象的分析、设计和编程方法。文章深入讨论了接口与抽象类的区别、基于接口编程的优势，以及“多用组合、少用继承”的设计理念。同时，介绍了贫血模型与充血模型，强调了SOLID原则中的单一职责和开闭原则。还解析了KISS、YAGNI、DRY、LOD等编程规范与重构原则，并探讨了重构、单元测试、代码可测试性和解耦的关键技巧。通过这些内容，文章为读者提供了丰富的编程规范与设计思路，帮助提高代码质量与设计水平。]]></description><category></category></item><item><title><![CDATA[37 | 实战二（下）：重构ID生成器项目中各函数的异常处理代码]]></title><link>https://blog.youkuaiyun.com/qq_44711486/article/details/142600254</link><guid>https://blog.youkuaiyun.com/qq_44711486/article/details/142600254</guid><author>qq_44711486</author><pubDate>Tue, 08 Oct 2024 10:03:58 +0800</pubDate><description><![CDATA[本文核心内容是重构ID生成器项目中的异常处理代码。首先，文章探讨了generate()函数中主机名获取失败时返回NULL值的合理性，并提出了抛出受检异常的改进方案。随后，文章对getLastFieldOfHostName()和getLastSubstrSplittedByDot()函数进行了重构，增加了异常处理逻辑。通过这些改进，文章强调全面合理的异常处理有助于减少bug，提升代码健壮性。重构后的RandomIdGenerator代码展示了具体的异常处理优化，提供了实际的重构思路。本文通过简单的ID生成器代]]></description><category></category></item></channel></rss>