简介
定义:定义一个用于创建对象的接口,让子类决定实例化哪个类。工厂方法使一个类的实例化延迟到子类中。
优点 :将实例化产品对象的具体过程隐藏,高层模块只需要知道产品的抽象类,其他的实现都不用关心,降低了模块之间的耦合,且产品扩展更加方便。
抽象工厂模式
抽象工厂模式是工厂模式的延伸,与工厂模式一样延迟实例初始化到子类中,抽象工厂模式的特点是有有更多的具体工厂。
实现
- 抽象工厂:这是个接口,只需定义一个抽象产品类型的抽象方法。
interface FruitGardener {
fun factory(): Fruit?
}
- 具体工厂:实现抽象工厂接口,重写其中的方法,在这里将实例化具体产品。具体工厂用于创建对象。
class AppleGardener : FruitGardener {
override fun factory(): Fruit {
return Apple()
}
}
- 抽象产品: 这是一个接口,里面定义了所有具体产品的公共方法。
interface Fruit {
fun grow()
fun harvest()
fun plant()
}
- 具体产品:实现抽象产品接口,重写接口里的方法。
class Apple : Fruit {
override fun grow() {
println("苹果在生长")
}
override fun harvest() {
println("收获苹果")
}
override fun plant() {
println("栽种苹果")
}
}
- 具体调用
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
var fruitGardener = AppleGardener()
var apple = fruitGardener.factory()
apple.plant()
apple.grow()
apple.harvest()
}
}
思考
看到上面那么多代码,难免会有人疑惑,我就想创建个对象,为什么有这么多繁杂的步骤?
这就是设计模式精髓所在了,在通常简单业务逻辑下根本无需设计模式,设计模式存在的意义就是在复杂环境下为了重用代码、使代码更易理解并保证代码的可靠性。
作为客户端开发者更多是面向UI和网络接口开发,对于上述的工厂模式,他们基本都用不上,不过这个在服务端应该是非常常见。