前言
前面我们介绍了工厂方式模式Android设计模式详解之工厂方法模式,抽象工厂模式类似,同样是创建型设计模式;
定义:
为创建一组相关或者是相互依赖的对象提供一个接口,而不需要指定它们的具体类。
使用场景:
一个对象族有相同的约束时可以使用抽象工厂模式;
实现示例
这里我们同样以数据存储
举例,参考前面文章进行实现;
- IOHandler,抽象产品;
interface IOHandler {
/**
* 添加
*/
fun add(key: String, value: String)
/**
* 移除
*/
fun remove(key: String)
/**
* 修改
*/
fun update(key: String, value: String)
/**
* 查找
*/
fun query(key: String): String
}
- IOFactory,抽象工厂;
interface IOFactory {
fun createIOHandler(handlerClazz: Class<out IOHandler>): IOHandler
}
- 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 : IOFactory {
override fun createIOHandler(handlerClazz: Class<out IOHandler>): IOHandler {
return handlerClazz.newInstance()
}
fun getMemoryIOHandler(): IOHandler {
return createIOHandler(MemoryHandler::class.java)
}
fun getFileIOHandler(): IOHandler {
return createIOHandler(FileHandler::class.java)
}
}
- 测试类,调用简单工厂进行产品生产;
object Test {
@JvmStatic
fun main(args: Array<String>) {
val memoryIOHandler = IOHandlerFactory.getMemoryIOHandler()
val fileIOHandler = IOHandlerFactory.getFileIOHandler()
}
}
总结
优点:
使用抽象工厂从具体的产品实现中解耦,基于接口与实现的分离,使抽象工厂方法模式在切换产品类时更加灵活;
缺点:
- 类文件爆炸性增加;
- 不太容易扩展新的产品类;
结语
如果以上文章对您有一点点帮助,希望您不要吝啬的点个赞加个关注,您每一次小小的举动都是我坚持写作的不懈动力!ღ( ´・ᴗ・` )