工厂方法模式(多态工厂模式)

1. 什么是工厂方法模式?

        工厂方法模式是由(1)抽象工厂(2)具体工厂(3)抽象产品(4)具体产品 四个部分组成的类创建型设计模式具体结构如下图所示

 2. 怎么用?

2.1 工厂方法模式的适用环境

        (1)客户端不知道所需要对象的类

        (2)抽象工厂类通过子类指定创建哪个对象

2.2 具体使用上实例代码

        以日志记录器为例设计结构如下

 2.2.1 客户端

public class Client {
    public static void main(String[] args) {
        LoggerFactory factory;
        Logger logger;
        factory = (LoggerFactory) XMLUtil.getBean();
        logger = factory.createLogger();
        logger.writeLog();
    }
}

2.2.2 抽象工厂类及其子类

//抽象工厂类
public interface LoggerFactory {
    public Logger createLogger();
}
//数据库日志工厂类
public class DatabaseLoggerFactory implements LoggerFactory {

    public Logger createLogger() {
        //连接数据库,代码省略
        //创建数据库日志记录器对象
        Logger logger = new DatabaseLogger();
        //初始化数据库日志记录器,代码省略
        return logger;
    }
}
//文件日志工厂类
public class FileLoggerFactory implements LoggerFactory {

    public Logger createLogger() {
        //创建文件日志记录器对象
        Logger logger = new FileLogger();
        //创建文件,代码省略
        return logger;
    }
}

 2.2.3 抽象产品类及其子类

//抽象产品类
public interface Logger {
    public void writeLog();
}

//数据库日志产品类
public class DatabaseLogger implements Logger {

    public void writeLog() {
        System.out.println("数据库日志记录");
    }
}

//文件日志产品类
public class FileLogger implements Logger {

    public void writeLog() {
        System.out.println("文件日志记录");
    }
}

2.2.4 xml配置文件及反射使用(补充)

        配置文件

<?xml version="1.0"?>
<config>
    <className>org.factorymethodpattern.logger.FileLoggerFactory</className>
</config>

        xml工具类

public class XMLUtil {
    //该方法从xml配置文件中提取具体类的类名,并返回一个实例对象
    public static Object getBean(){
        try {
            //创建DOM文档对象
            DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = dFactory.newDocumentBuilder();
            Document doc;
            doc = builder.parse(new File("src/main/java/org/factorymethodpattern/logger/config.xml"));
            //获取包含类名的文本节点
            NodeList nl = doc.getElementsByTagName("className");
            Node classNode = nl.item(0).getFirstChild();
            String cName = classNode.getNodeValue();

            //通过类名生成实例对象并将其返回
            Class c = Class.forName(cName); 
            Object obj = c.newInstance();
            return obj;
        }
        catch (Exception e){
            e.printStackTrace();
            return null;
        }
    }
}

3.1 个人感悟

        设计原则是设计理念,设计模式是对于设计原则的应用,不同设计模式应用了不同的设计理念;工厂方法模式是对 开闭原则,里氏代换原则,依赖倒转原则的直观应用。

        如果有不对的地方希望指正,共勉                                                                                                

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值