工厂模式是一种常用的软件设计模式,它提供了一种创建对象的简单方法。这种模式允许开发者在不指定具体类的情况下创建对象,从而使得代码更加灵活和可扩展。工厂模式的主要目的是封装对象的创建过程,将对象的创建和使用分离开来,这样当需要创建的对象类型发生变化时,只需修改工厂类即可,而无需修改使用对象的代码

打开网易新闻 查看精彩图片

工厂模式通常包含一个工厂接口和一个或多个实现该接口的具体工厂类。工厂接口定义了创建对象的方法,而具体工厂类则实现了这些方法,负责实际的对象创建工作。这种设计使得新增对象类型时,只需添加一个新的具体工厂类即可,而无需修改现有的工厂接口和其他工厂类,符合开闭原则。

在实际应用中,工厂模式可以简化对象的创建过程,提高代码的可读性和可维护性。,在https://www.emjgzxw29.com/squint/1.html需要创建多种不同类型的产品对象时,可以使用工厂模式来统一管理这些产品的创建,使得代码结构更加清晰。同时,工厂模式也有助于减少代码中的重复代码,提高代码的复用性。

单例模式:确保全局只有一个实例

单例模式是一种常用的软件设计模式,其核心目的是确保在应用程序的整个生命周期中,某个类只有一个实例存在。这种模式在需要控制资源访问、管理共享资源或协调系统行为时非常有用。

实现单例模式的方法有多种,包括懒汉式、饿汉式、双重检查锁定等。懒汉式https://www.emjgzxw29.com/squint/2.html单例模式在第一次被引用时才创建实例,而饿汉式则在类加载时就创建实例。双重检查锁定是一种线程安全的懒汉式实现,它通过两次检查确保只创建一个实例。

单例模式的实现需要考虑线程安全、序列化和反射攻击等问题。在多线程环境下,需要确保只有一个线程能够创建实例。对于序列化问题,可以通过实现`readResolve`方法来确保反序列化时返回的是同一个实例。对于反射攻击,可以通过在构造函数中添加逻辑来防止通过反射创建多个实例。

观察者模式:实现对象间的松耦合通信

观察者模式是一个设计模式,它的核心思想是实现对象之间的订阅-发布机制。当一个对象的状态发生变化时,所有依赖于它的对象都能自动获得通知并进行更新。这个模式广泛应用于软件设计中,特别是在需要处理事件、状态变化等场景下。下面将详细介绍观察者模式的应用场景及其实现方式。 在观察者模式中,主要有三个角色: 被观察者(Observable):负责收集、管理所有观察者并触发状态改变的通知。 观察者(Observer):负责接收https://www.emjgzxw29.com/squint/3.html被观察者发送的状态改变通知,并根据不同的状态做出相应的动作。 具体观察者(Concrete Observer):实现观察者接口,处理被观察者发出的通知。 观察者模式常用于以下场景: 用户订阅新闻、博客或在线课程的状态更新,当这些内容有新发布时,订阅者能够立即获得通知。 消息中间件中的消息发布与订阅,Kafka或RabbitMQ,消息生产者发布消息,消息消费者订阅消息。 事件驱动的系统,如图形用户界面中的控件事件,如按钮点击、滑块移动等,这些事件会触发相关的处理逻辑。 在软件架构中实现松耦合,比如在MVC(Model-View-Controller)模式中,模型发生变化时,视图和控制器需要同步更新。 实现观察者模式的步骤包括: 定义被观察者接口,包含添加和移除观察者的方法,以及状态改变时触发通知的方法。 实现具体的被观察者类,持有观察者集合,并在状态改变时调用通知方法。 定义观察者接口,包含接收状态改变通知的方法。 实现具体的观察者类,实现观察者接口,处理状态改变的回调。 通过以上步骤,可以构建一个灵活的观察者模式实现,使得系统在状态改变时能够高效地通知相关部分进行相应处理。

策略模式:定义一系列算法并使它们可互换

策略模式(Strategy Pattern)是一种比较简单的模式,也叫政策模式(Policy Pattern)其定义如下:Define a family of algorithms each one , and make them interchangeable(定义一组算法,将每个算法都封装起来,并且使他们之间可以互换) 这个定义很清晰、明确,”定义一组算法“就是定义了3个计谋,”将每个算法封装起来“,封装类Context的作用,”使他们可以互换“,因为都实现的是相同的接口。 ▶算法可以自由切换 这是策略模式本身定义,只要实现抽象类,他就成为策略家族的一个成员,通过封装角色对其进行封装,保证对外提供”可自由切换的模式“的策略。 ▶避免使用多重条件判断 可以由其他模块决定采用何种策略,策略家族对外提供的访问接口就是封装类,简化了操作,,同时避免了条件语句判断。 ▶扩展性良好 在现有系统中增加一个策略十分容易,只要实现接口就可以,其https://www.emjgzxw29.com/squint/4.html他都不用修改,类似于一个可反复拆卸的插件,也符合OCP原则(开闭原则) ▶策略类数量多 每一个策略都是一个类,复用可能性很小,类的数量增多。 ▶所有策略都需要对外暴露 上层模块必须知道有哪些策略,才能决定使用哪一个策略,这与迪米特法则是相违背的。我们可以使用其他的模式来修正这个缺点,如工厂模式、代理模式、享元模式。 ▶多个类只有在算法或行为上稍有不同的场景 ▶算符需要自由切换的场景 ▶需要屏蔽算法规则的场景 如果系统中的一个策略家族的具体策略数量超过4个,则需要考虑使用混合模式,解决策略膨胀和对外暴露的问题。 输入3个参数,进行加减法运算,参数中两个是int型,剩下的一个参数是String类型的,只有”+“、”-“两个符合可以选择,不要考虑什么复杂校验,进行白箱测试,输入的就是标准的int 类型和String类型。 为什么叫策略枚举?它是一个枚举类。策略呢?我们定义了一个抽象的方法 exec(int a ,int b) 在每个枚举成员中进行实现,如果不实现就不能编译。把原有定义在抽象策略中的方法移植到枚举中,每个枚举成员就成为一个具体策略 枚举策略定义如下:

装饰器模式:动态地给对象添加额外职责

装饰器模式是一种结构性设计模式,它允许在不改变对象的结构和功能的前提下,为对象动态地添加额外职责。通过使用装饰器模式,可以在运行时增加对象的功能,而不影响其他使用该对象的代码,这使得程序的扩展更为灵活。

在装饰器模式中,通常会定义一个接口,用于规范被装饰对象和装饰者。被https://www.emjgzxw29.com/squint/5.html装饰的对象实现该接口,而装饰者也实现同一接口,并持有被装饰对象的引用。通过组合关系,装饰者可以在调用被装饰对象的核心功能之前或之后,添加自己的行为。

这种模式的典型应用场景包括图形界面组件的增强,如在基础的窗口组件上添加滚动条、边框或布局管理等功能。通过将这些功能封装为独立的装饰类,开发者可以灵活地创建不同的组件组合,提高代码的复用性。

装饰器模式与其他模式如策略模式、工厂模式有所不同,其核心优势在于能够在运行时动态组合行为,而不需要创建大量的子类。这样,可以有效减少类的数量,并使得代码结构更加清晰和可维护。