设计模式(二):工厂方法模式
强烈推介IDEA2020.2破解激活,IntelliJ IDEA 注册码,2020.2 IDEA 激活码
模式动机 在简单工厂模式中,如果在原来的实现的基础上,我们再增加一个产品类的实现,那么我们必须在原来的工厂方法里修改工厂类的源代码.那么有没有更好的方法,可以不修改工厂类的源代码而进行动态的可扩展呢?今天我们将要介绍的设计模式之工厂方法模式,就是这样的一个很好的设计思路:将工厂类进行抽象,根据不同的产品创建不同的工厂类,如果动态的增加了一个产品,我们只需要实现这个产品的具体类的工厂类即可。
模式定义 工厂方法模式也称为工厂模式,属于创建型模式。在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。
模式结构 工厂方法模式包含如下角色:
Product:抽象产品
ConcreteProduct:具体产品
Factory:抽象工厂
ConcreteFactory:具体工厂
代码示例 这里我们通过一个具体的实例来进行讲解,在我们编写程序的过程中,我们经常会遇到各种日志,有文件的日志,数据库的日志等。我们这里创建两个抽象的类Log和LogFactory
package cn.edu.hust.factory;
public abstract class Log {
public abstract void writeLog();
}
package cn.edu.hust.factory;
public abstract class LogFactory {
public abstract Log createLog();
}
接下来就是创建Log的实现类:
package cn.edu.hust.factory;
public class FileLog extends Log{
public void writeLog() {
System.out.println("文件日志。。。。");
}
}
package cn.edu.hust.factory;
public class FileLog extends Log{
public void writeLog() {
System.out.println("文件日志。。。。");
}
}
然后就是生产两种日志的工厂类:
package cn.edu.hust.factory;
public class FileLogFactory extends LogFactory{
public Log createLog() {
return new FileLog();
}
}
package cn.edu.hust.factory;
public class DataBaseLogFactory extends LogFactory{
public Log createLog() {
return new DataBaseLog();
}
}
在实际的应用中,我们根据需求使用不同的工厂生产出不同的对象。这里,如果要有一个WebLog类,我们可以继承Log类,然后创建一个WebLogFactory,只是动态的扩展不需要修改任何的系统代码。
工厂模式优点
工厂模式缺点
适用场景 在以下情况下可以使用工厂方法模式:
原文:https://github.com/oeljeklaus-you/Design-Patterns/blob/master/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F(%E4%BA%8C)%E5%B7%A5%E5%8E%82%E6%96%B9%E6%B3%95%E6%A8%A1%E5%BC%8F.md