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

    参考资料

  • 相关阅读:
    递归的效率问题以及递归与循环的比较
    malloc/free与new/delete的区别
    类的综合案例——纯虚函数与抽象类( 加强对接口与多态,以及派生类构造函数的理解 )
    对象移动、右值引用详解
    深入理解类成员函数的调用规则(理解成员函数的内存为什么不会反映在sizeof运算符上、类的静态绑定与动态绑定、虚函数表)
    为什么NULL指针也能访问成员函数?(但不能访问成员变量)
    洛谷P1656 炸铁路
    Vijos1901 学姐的钱包
    洛谷P2327 [SCOI2005] 扫雷
    洛谷P1993 小 K 的农场
  • 原文地址:https://www.cnblogs.com/MrSaver/p/13150994.html
Copyright © 2020-2023  润新知