尽管简单工厂模式实现了对象的建立和使用分离,可是仍然存在如下两个问题:java
一个更好的办法是使用工厂方法模式。数据库
工厂方法模式:定义一个用于建立对象的接口,让子类决定将哪个类实例化。
工厂方法又简称工厂模式或虚拟构造器模式或多态工厂模式,让一个类的实例化延迟到其子类,是一种类建立型模式。
结构图以下:性能
工厂方法模式包含如下四个角色:测试
日志记录器的设计:该记录器能够经过多种途径保存系统的运行日志,例如文件记录或者数据库记录。
代码以下:this
public class Test { public static void main(String[] args) { LoggerFactory factory = new FileLoggerFactory(); Logger logger = factory.createLogger(); logger.log(); } } //抽象产品 interface Logger { void log(); } //具体产品:DatabaseLogger class DatabaseLogger implements Logger { public void log() { System.out.println("数据库日志记录"); } } //具体产品:FileLogger class FileLogger implements Logger { public void log() { System.out.println("文件日志记录"); } } //抽象工厂 interface LoggerFactory { Logger createLogger(); } //具体工厂:DatabaseLoggerFactory class DatabaseLoggerFactory implements LoggerFactory { public Logger createLogger() { return new DatabaseLogger(); } } //具体工厂:FileLoggerFactory class FileLoggerFactory implements LoggerFactory { public Logger createLogger() { return new FileLogger(); } }
能够把抽象工厂设置为抽象类,工厂方法直接能够对客户端隐藏,也就是说能够直接经过抽象工厂调用具体产品类的业务方法,客户端无需建立具体产品,直接经过工厂类调用便可,代码修改以下(抽象产品以及具体产品类不用修改):spa
//抽象工厂 abstract class LoggerFactory { public void log() { this.createLogger().log(); } public abstract Logger createLogger(); } //具体工厂:DatabaseLoggerFactory class DatabaseLoggerFactory extends LoggerFactory { public Logger createLogger() { return new DatabaseLogger(); } } //具体工厂:FileLoggerFactory class FileLoggerFactory extends LoggerFactory { public Logger createLogger() { return new FileLogger(); } } public class Test { public static void main(String[] args) { LoggerFactory factory = new FileLoggerFactory(); factory.log(); } }