Introduction 🔥
我们所有人都知道设计模式,或者至少在我们作为开发人员的生活中曾经听说过它们,它们应该确保我们代码库的维护完整性并减少麻烦,但是对吗? 事实是,在某些情况下,您不需要此模式,而这些情况可能与不使用OOP语言,编写项目时并不十分在意其可伸缩性或使用设计模式不够复杂而有所不同。 。 在本文中,我们将动手使用Kotlin编码以及UML和一些热门提示!
Prerequisite ☕️
在继续之前,您需要熟悉UML,一些Kotlin基本知识,并对Java如何处理继承有所了解。
Quick note before reading 📖
由于现在是2020年,我们都已被隔离,因此我使用了一个与2020年大流行有关的示例。 我们将创建一个病毒工厂,该工厂创建病毒Java对象! 我知道这不是100%实用的,但是。 它的好玩。
This article can also be found on my blog archive which is located here https://jimfilippou.github.io/blog/using-the-factory-design-pattern-with-kotlin.
Taking a look at the UML we will be implementing. 👀
UML图将如下所示
Planning 📝
我们需要将以下UML转换为实际代码,因此让我们将工作分解为任务。
- 创建病毒界面创建具体的病毒类,以实现病毒接口创建一个将包含病毒类型(常量)的枚举创建病毒Factory最终会产生适当的病毒根据枚举给出的病毒类型使用我们所做的
implementing ⚒
1. Creating the virus interface
下面的代码将使之成功接口👇
interface Virus {
public fun mutate()
public fun spread() {
println("Spreading the virus...")
}
}
提示:请注意,在常规的Java接口中,通常只执行声明,而不执行实现。 该功能体是100%可选的,因为在将来它会被覆盖。
以下声明来自文档:
Kotlin中的接口可以包含抽象方法的声明以及方法的实现。 它们与抽象类的不同之处在于接口无法存储状态。 它们可以具有属性,但是这些属性必须是抽象的或提供访问器实现。
2. Creating concrete virus classes
现在我们需要创建不同的类来实现病毒接口。
💡提示:您可以根据需要创建任意多个类,只要它们实现了病毒接口。 通常,当您有很多类时,此模式会更有用,因为只有几个类时,您可以解决此问题,并避免使用此模式。
class CoronaVirus: Virus {
override fun mutate() {
println("Mutating the corona virus...")
}
}
class InfluenzaVirus: Virus {
override fun mutate() {
println("Mutating the flu virus...")
}
}
class HIVVirus: Virus {
override fun mutate() {
println("Mutating the HIV virus...")
}
}
3. Creating the enumeration
在Kotlin中,制作一个枚举通过使用以下代码👇
enum class VirusType {
CORONA_VIRUS, INFLUENZA, HIV
}
但是为什么我们以这种方式使用常量呢? 我们不能只将字符串用于病毒类型吗?
答案是肯定的,但是,一个好的实践是不要使用字符串,因为字符串更容易出错,因为作为人类,我们倾向于非常频繁地输入错字。
一世f you are coming from the front-end world, the same reason applies to Redux action types ⚛
4. Creating the factory 🏭
现在让我们实现病毒工厂🚀课
class VirusFactory {
fun makeVirus(type: VirusType): Virus? {
return when(type) {
VirusType.CORONA_VIRUS -> CoronaVirus()
VirusType.INFLUENZA -> InfluenzaVirus()
VirusType.HIV -> HIVVirus()
else -> null
}
}
}
提示:返回类型为病毒?这意味着它可能会返回空值。 之所以这样做,是因为我们要确保工厂仅接受内部指定的病毒类型。什么时候关键词。 的什么时候关键字就像开关关键字,但性感得多。
5. Using the factory 🏭
现在一切都完成了,让我们使用刚刚创建的工厂!
fun main() {
val factory = VirusFactory()
val virus = factory.makeVirus(VirusType.CORONA_VIRUS)
virus?.spread()
virus?.mutate()
}
💡提示:请注意,我们调用了函数变异和传播在访问对象的属性和/或方法之前,带问号。 此问号表示功能将只要被称为病毒对象是不空值。
如果您熟悉JavaScript,它的行为就像可选链接
Thank you for reading! 🎉
你到了尽头! 我希望你学到了一些东西。 如果您需要整个代码库,我将其嵌入在下面,以便您可以复制和粘贴它。 在评论中让我知道您对本文或此设计模式的总体看法。