设计模式:学习笔记(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();  
    }  
}

 

参考资料

 

posted @ 2020-06-17 10:30  子烁爱学习  阅读(249)  评论(1编辑  收藏  举报