单模式是最常见的设计模型。它可以确保在全球情况下只有一个示例并避免线程安全问题。有许多方法可以实现单个示例模式,我建议三个最佳实践:双测试锁,静态内部方法,饥饿的人方法和枚举方法。饥饿的人和枚举方法属于饥饿的汉风格。
在多线程环境中,为了提高实例初始化的性能,不是每次获得示例时锁定该方法的方法,但是当未创建实例时,它将被锁定,如下所示::
单个情况的静态内部类实现巧妙地使用Java类加载机制来确保其线程安全性在多线程环境中。只有在第一次调用它时才初始化它,并且我们无法通过反射获得内部属性。可以看出,静态内部类方法更安全地实现单个情况并防止反射。特定的实现方法是以下内容:
饥饿的汉风格的单一情况非常简单,并且在加载类时创建了一个示例。饥饿的人使用私人结构功能来初始化全局单个实例,并使用公共静态最终最终将其修改以延迟加载和确保线程安全性。实现方法如下所示:
枚举方法是一种自然的单个案例实施,非常建议使用项目开发中的枚举方法。它可以确保实例在序列化和deepertine过程中的唯一性,并且不必担心线程安全性问题枚举方法实现了单个示例,如下所示:
此外,有许多方法可以在Netty中实现单个case练习,例如MQTTENCODER,READTIME OUTEXCEPTION,等等。
出厂模式封装了对象创建过程,用户不需要关心对象创建的详细信息。在复杂对象的场景中,可以实现工厂模型。Factory模型分为三种类型:简单:工厂模型,工厂方法模型和抽象工厂模型。
简单的工厂模型。根据参数类型定义工厂类,并根据参数类型返回不同类型的实例。它适用于具有多种类型的对象实例类型的方案。如果对象实例的类型太多,则添加每种类型以在工厂类别中添加相应的创建逻辑,这违反了开放和关闭的原理。
工厂方法模型。简单工厂模型的升级版本不再提供统一的工厂类来创建所有对象的示例。相反,每种类型的对象实例都对应于不同的工厂。每个特定的工厂类别只能创建一种类型的typeObject实例。
摘要工厂模型。无用,适合创建多个产品。抽象工厂类,然后创建工厂对象并通过组合获得工厂方法。
Netty中使用了工厂方法模型,这也是项目开发中最常用的工厂模型。如何使用工厂方法模式?让我们首先查看一个简单的示例:
Netty在创建频道时使用出厂方法模式,因为服务器和客户端的频道不同。Netty将反射与出厂方法模式相结合,仅使用一个工厂类,然后基于通过类参数构造相应的频道,无需要为每个通道类型创建工厂类。特定源代码的实现如下:
尽管反射技术可以有效地减少工厂类别中的数据量,但与直接创建工厂类别相比,反射是绩效损失。因此,使用反思应该谨慎。
构建器模式非常简单。对象的属性是通过链调用设置的。它在对象属性的情况下非常有用。建造器模型的优势在于,他们需要自由地需要的属性,例如构建块不受限制。对于用户,需要设置哪些属性以及可能需要的属性在不同的情况下,也有所不同。
Netty中的ServerBootstrap和Bootstrap指南是最经典的构建器模式实现。在施工过程中,需要大量参数,例如配置线程池事件loopgroup,设置通道类型,注册通道手,设置频道参数,端口绑定等。ServerBootstrap指南的具体使用可以参考指南:指南是什么:客户和服务器启动?”当然,我不会在这里详细介绍。
策略模型为同一问题提供了各种策略。这些策略可以彼此替换,从而在一定程度上提高了系统的灵活性。该策略模型非常符合开放和关闭的原则。用户在不修改现有系统的情况下选择不同的策略,并促进扩展并增加新策略。
Netty在许多地方使用战略模式。例如,EventExeCutorChooser提供了选择NioEventloop的不同策略。NewChooser()方法将根据线程池的大小是否为2. Improve performance.EventexecutorChooserCouseer源代码,将使用模制计算方法动态选择模制计算方法的方法振动。
装饰模式增强了装饰类的功能。在装饰的前提下,它可以为装饰类添加新的功能功能。当我们需要将装饰模式用于类扩展功能时,此模式的缺点是增加附加代码通过一个简单的示例进行装饰模式,如下所示:
我们创建了一个形状界面抽象装饰变形器,并维护了形状的原始对象。FillReadColorShapeCorator是用于装饰变形器的物理类。它没有修改draw()method.method,然后调用filcolor()方法以进行颜色填充。
让我们看一下Netty的Bytebuf如何装饰包裹。源代码如下:
CrappedByteBuf是所有Bytebuf装饰物的基类。这并不特别。它也是构造函数中的原始bytebuf实例。WrappedByteBuf有两个子类Unryablebytebuf和Simplelakawarebybytebuf。Bytebuf的功能真正增强了它们。例如,直接返回false的UnreleasableByteBuf的Release()方法,以指示未释放源代码。
我想知道您是否会有问题。装饰模式和代理模式通过目标类别增强。它们之间有什么区别吗?装饰模式的实现和代理模式确实非常相似。他们需要维护原始目标对象。装饰模式着重于在目标类中添加新功能。代理模式着重于根据现有功能扩展。