设计模式:学习笔记(14)——工厂方法模式
设计模式:学习笔记(14)——工厂方法模式
工厂方法模式
工厂方法模式又称为工厂模式,它属于类创建型模式。在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。
简单工厂模式的缺点
在简单工厂模式中只有一个工厂类,该工厂类处于对产品类进行实例化的中心位置,它需要知道每一个产品类的实现细节,并决定何时实例化哪一个产品类。简单工厂模式最大的缺点就是当有新产品要加入系统中时,必须修改工厂类,需要在其中加入必要的业务逻辑,这违背了开闭原则。
此外,在简单工厂模式中,所有的产品都由同一个工厂创建,工厂类职责较重,业务逻辑较为复杂,具体产品与工厂类之间的耦合度高,严重影响了系统的灵活性和扩展性,而工厂方法模式则可以很好地解决这一问题。
子工厂负责创建产品
在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体的创建工作交给子类去做。它仅仅负责给出具体工厂必须实现的方法,而不负责哪一个产品类被实例化这种细节!
工厂方法的具体类图如下:
工厂方法模式,又称为工厂模式。
模式分析
模式应用
JDK中,也有很多使用工厂方法模式的代码,比如Collection.iterator()是生产了一个迭代器对象,此时Collection就可以看作总的抽象工厂,那么它下面有很多子工厂,比如ArrayList、LinedList等等,那产品的抽象接口就是Iterator,它定义了产品所需功能的细节。各个不同具体工厂来生产不同的具体产品。
优缺点
增加产品类时无需修改现有系统,并封装了了产品对象的创建细节,系统具有良好的灵活性和可扩展性。但是增加产品时需要新增新的工厂,导致系统类的个数成对增加,在一定成都上增加了系统的复杂性。
实例
//日志记录器接口:抽象产品 interface Logger { public void writeLog(); } //数据库日志记录器:具体产品 class DatabaseLogger implements Logger { public void writeLog() { System.out.println("数据库日志记录。"); } } //文件日志记录器:具体产品 class FileLogger implements Logger { public void writeLog() { System.out.println("文件日志记录。"); } } //日志记录器工厂接口:抽象工厂 interface LoggerFactory { public Logger createLogger(); } //数据库日志记录器工厂类:具体工厂 class DatabaseLoggerFactory implements LoggerFactory { public Logger createLogger() { //连接数据库,代码省略 //创建数据库日志记录器对象 Logger logger = new DatabaseLogger(); //初始化数据库日志记录器,代码省略 return logger; } } //文件日志记录器工厂类:具体工厂 class FileLoggerFactory implements LoggerFactory { public Logger createLogger() { //创建文件日志记录器对象 Logger logger = new FileLogger(); //创建文件,代码省略 return logger; } } class Client { public static void main(String args[]) { LoggerFactory factory; Logger logger; factory = new FileLoggerFactory(); //可引入配置文件实现 logger = factory.createLogger(); logger.writeLog(); } }
参考资料
- https://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/factory_method.html
- 《设计模式(Java版)》