工厂方式模式是创建型设计模式
;
定义:
定义一个用于创建对象的接口,让子类决定实例化哪个类。
使用场景:
在任何需要生成复杂对象的地方,都可以使用工厂方法模式。复杂对象适合使用工厂模式,用new就可以完成创建的对象无需使用工厂模式。
UML类图:
Product:
抽象产品;
ConcreteProduct:
具体产品;
Factory:
抽象工厂;
ConcreteFactory:
具体工厂;
我们以数据存储方式
举例,实际开发中数据存储方式可以有文件存储
、内存缓存
等等,这里我们就使用工厂方法模式来实现:
interface IOHandler {
/**
* 添加
*/
fun add(key: String, value: String)
/**
* 移除
*/
fun remove(key: String)
/**
* 修改
*/
fun update(key: String, value: String)
/**
* 查找
*/
fun query(key: String): String
}
class FileHandler : IOHandler {
override fun add(key: String, value: String) {
}
override fun remove(key: String) {
}
override fun update(key: String, value: String) {
}
override fun query(key: String): String {
return ""
}
}
class MemoryHandler : IOHandler {
override fun add(key: String, value: String) {
}
override fun remove(key: String) {
}
override fun update(key: String, value: String) {
}
override fun query(key: String): String {
return ""
}
}
object IOHandlerFactory {
enum class TYPE {
MEMORY, FILE
}
fun createIOHandler(type: TYPE): IOHandler {
return when (type) {
TYPE.MEMORY -> MemoryHandler()
TYPE.FILE -> FileHandler()
}
}
}
object Test {
@JvmStatic
fun main(args: Array<String>) {
val memoryIOHandler = IOHandlerFactory.createIOHandler(IOHandlerFactory.TYPE.MEMORY)
memoryIOHandler.add("key", "value")
}
}
工厂方法模式相较于简单工厂新增工厂接口
以及具体工厂创建类
;
interface IOFactory {
fun createIOHandler(): IOHandler
}
/**
* 文件存储具体工厂
*/
class FileIOFactory : IOFactory {
override fun createIOHandler(): IOHandler {
return FileHandler()
}
}
/**
* 内存具体工厂
*/
class MemoryIOFactory : IOFactory {
override fun createIOHandler(): IOHandler {
return MemoryHandler()
}
}
object Test {
@JvmStatic
fun main(args: Array<String>) {
val fileFactory = FileIOFactory().createIOHandler()
fileFactory.add("key", "value")
val memoryFactory = MemoryIOFactory().createIOHandler()
memoryFactory.add("key", "value")
}
}
setContentView(View view)
方法setContentView(LinearLayout(this))
,我们知道LinearLayout
继承于ViewGroup,而ViewGroup又是View的子类,这个方法满足让子类决定实例化哪个类,故而采用的是工厂模式。优点:
对象的创建统一交给工厂去生成,有良好的封装性,同时也做到了解耦,也满足最少知识原则;
缺点:
每次添加新的产品都需要新增产品类和对应的工厂类,会导致类结构复杂化,因此需要结合实际情况去评估是否使用工厂模式。
如果以上文章对您有一点点帮助,希望您不要吝啬的点个赞加个关注,您每一次小小的举动都是我坚持写作的不懈动力!ღ( ´・ᴗ・` )