关于学习:设计模式创建型工厂方法

55次阅读

共计 1414 个字符,预计需要花费 4 分钟才能阅读完成。

介绍

工厂办法是一种创立型设计模式,其在父类中提供一个创建对象的办法,容许子类决定实例化对象的类型。

场景

如果咱们开发我的项目中的日志模块,业务初期只有控制台日志,大部分代码都在控制台日志类。随着业务倒退,心愿能够减少文件日志性能。

如果代码之间曾经存在耦合关系,此时向程序增加新类并不是一件简略的事件。目前大部分代码都与控制台日志类无关。增加文件日志类须要批改全副代码,更可怕的是当前万一要拓展其余日志类,很可能须要再次大幅批改代码。

如此重复重复,祝贺胜利诞生一份不可保护的祖传代码。????

解决方案

工厂办法模式倡议应用非凡的工厂办法代替间接调用 new 关键字创建对象。工厂办法返回的对象通常被称作“产品”。

public abstract class Logger {public abstract void log();
}
public class ConsoleLogger extends Logger {
    @Override
    public void log() {System.out.println("我是控制台日志器!");
    }
}
public class FileLogger extends Logger {
    @Override
    public void log() {System.out.println("我是文件日志器!");
    }
}

紧接着咱们再创立一个工厂类,这里申明为抽象类,并且设置一个形象办法,强制子类实现形象办法。你也能够设置不设置成抽象类,在根底工厂办法中返回默认类型。

public abstract class LoggerFactory {public abstract Logger createLogger();
}
public class ConsoleLoggerFactory extends LoggerFactory {
    @Override
    public Logger createLogger() {return new ConsoleLogger();
    }
}
public class FileLoggerFactory extends LoggerFactory {
    @Override
    public Logger createLogger() {return new FileLogger();
    }
}

乍看之下,工厂办法模式看起来毫无意义,只是扭转了程序中调用构造函数的地位而已。然而咱们能够在子类里重写工厂办法,从而扭转其创立产品的类型。

但有一点须要留神,仅当这些产品具备独特的父类或者接口时,工厂子类能力返回不同类型的产品。同时工厂基类的工厂办法还应将其返回类型申明为共有接口。

只有产品类实现一个独特的接口,就能够将它传递给客户代码,而无需提供任何额定的数据。

public class Application {

    private final LoggerFactory loggerFactory;

    public Application(LoggerFactory loggerFactory) {this.loggerFactory = loggerFactory;}

    public void run() {Logger logger = loggerFactory.createLogger();
        logger.log();}
}

客户端代码仅通过形象类型应用工厂和产品,如须要增加新的产品,仅需实现工厂抽象类和产品抽象类即可。无需批改原有的工厂或者产品类。

总结

这是重新学习单例模式的笔记,其中可能有很多中央写的不对,写得不好,欢送大家斧正 ????。

正文完
 0