zoukankan      html  css  js  c++  java
  • Day1 工厂模式

    我的理解就是:工厂模式可以不用在乎参数的类型,工厂函数根据不同的类型,创建不同的对象。如下(简单工厂):

    package method.simpleFactory;
    import java.util.logging.Logger;
    
    
    class LoggerFactory {
        //静态工厂方法
        public static Logger createLogger(String args) {
            if(args.equalsIgnoreCase("db")) {
        //连接数据库, 代码省略
        //创建数据库日志记录器对象
                Logger logger = new DatabaseLogger();
        //初始化数据库日志记录器, 代码省略
                return logger;
            }
            else if(args.equalsIgnoreCase("file")) {
        //创建日志文件
        //创建文件日志记录器对象
                Logger logger = new FileLogger();
        //初始化文件日志记录器, 代码省略
                    return logger;
            }
            else {
                return null;
            }
        }
    }
    

    用于根据所传入的参数创建各种不同类型的日志记录器。 通过使用简单工厂模式, 我们将日志记录器对象的创建和使用分离,
    客户端只需使用由工厂类创建的日志记录器对象即可, 无须关心对象的创建过程, 但是我们发现, 虽然简单工厂模式实现了对象的创建和使用分离,
    但是仍然存在如下两个问题:
    (1) 工厂类过于庞大, 包含了大量的if…else…代码, 导致维护和测试难度增大;
    (2) 系统扩展不灵活, 如果增加新类型的日志记录器, 必须修改静态工厂方法的业务逻辑, 违
    反了开闭原则

    工厂模式代码如下:

    一个工厂类只负责一个具体类的创建:

    package method.factory;
    
    
    //日志记录器接口:抽象接口
    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 arg[]){
            LoggerFactory factory;
            Logger logger;
            factory =new FileLoggerFactory();
            logger = factory.createLogger();
            logger.writeLog();
        }
    }
    

    总结

    工厂方法模式的主要优点如下:
    (1) 在工厂方法模式中, 工厂方法用来创建客户所需要的产品, 同时还向客户隐藏了哪种具体
    产品类将被实例化这一细节, 用户只需要关心所需产品对应的工厂, 无须关心创建细节, 甚
    至无须知道具体产品类的类名。
    (2) 基于工厂角色和产品角色的多态性设计是工厂方法模式的关键。 它能够让工厂可以自主确
    定创建何种产品对象, 而如何创建这个对象的细节则完全封装在具体工厂内部。 工厂方法模
    式之所以又被称为多态工厂模式, 就正是因为所有的具体工厂类都具有同一抽象父类。
    (3) 使用工厂方法模式的另一个优点是在系统中加入新产品时, 无须修改抽象工厂和抽象产品
    提供的接口, 无须修改客户端, 也无须修改其他的具体工厂和具体产品, 而只要添加一个具
    体工厂和具体产品就可以了, 这样, 系统的可扩展性也就变得非常好, 完全符合“开闭原则”。

    个人小站:http://jun10ng.work/ 拥抱变化,时刻斗争,走出舒适圈。
  • 相关阅读:
    【bzoj4591】[Shoi2015]超能粒子炮·改 Lucas定理
    【bzoj1604】[Usaco2008 Open]Cow Neighborhoods 奶牛的邻居 旋转坐标系+并查集+Treap/STL-set
    十分钟看懂图像语义分割技术
    命令行执行python模块时提示ImportError: No module named xxx
    python json与字典对象互相转换
    C#中json字符串的序列化和反序列化
    Python当前线程休眠1秒钟
    python之bytes和string
    Win32 基本文件读写操作
    C# 字符串与字节数组相互转换
  • 原文地址:https://www.cnblogs.com/Jun10ng/p/12367023.html
Copyright © 2011-2022 走看看