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