zoukankan      html  css  js  c++  java
  • 设计模式:学习笔记(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();  
        }  
    }

    参考资料

  • 相关阅读:
    C++指针
    Linux Ubuntu常用终端命令
    java-JDBC-Oracle数据库连接
    HDU 1890 区间反转
    Hdu-3487 Splay树,删除,添加,Lazy延迟标记操作
    UVa 10088
    UVa10025-The ? 1 ? 2 ? ... ? n = k problem
    UVa10023手动开大数平方算法
    UVa 10007
    点的双联通+二分图的判定(poj2942)
  • 原文地址:https://www.cnblogs.com/MrSaver/p/13150994.html
Copyright © 2011-2022 走看看