设计模式——工厂方法模式分析

工厂方法模式包含以下角色:
1、抽象工厂
工厂方法模式的核心,声明了工厂方法;任何在模式中创建对象的工厂类都必须实现该接口。

2、具体工厂
抽象工厂类的子类,实现抽象工厂类中定义的工厂方法,包含与应用程序密切相关的逻辑

3、抽象产品
抽象产品是定义产品的接口,也是产品对象父类或接口

4、具体产品
实现抽象产品的接口,具体产品由具体工厂实现


优缺点

优点:
1、用户只需要关心所需产品对应的工厂,无需关心创建细节,甚至无需知道具体产品类的类名。
2、能够使工厂可以自主确定创建何种产品对象,而如何创建这个对象的细节则完全封装在具体工厂内部。
3、在系统中加入新产品时,只需添加一个具体工厂和具体产品即可,符合开闭原则。

缺点:
1、添加新产品时需要编写新的具体产品类,还要提供与之对应的具体工厂类,在一定程度上增加了系统复杂度。
2、考虑到系统的扩展性,引入抽象层,在客户端代码中使用抽象层进行定义,增加抽象性与理解难度。


模式适用环境

1、一个类不知道它所需要的对象的类:客户端不需要知道具体产品类的类名,只需要知道创建具体产品的工厂类。
2、一个类通过子类来指定创建对象。
3、将创建对象的任务委托给多个工厂子类中的某一个,客户端在使用时无需关心是哪一个工厂子类创建产品子类。


继续举栗子哈

某系统日志记录器要求支持多种日志记录方式,如文件记录、数据库记录等,且用户可以根据要求动态选择日志记录方式。

分类,抽象产品类Log,具体产品类FileLog、DatabaseLog,抽象工厂类LogFactory,具体工厂类FileLogFactory、DatabaseLogFactory。


详细代码

Log类

public abstract class Log {
    public abstract void writeLog();
}

FileLog类

public class FileLog extends Log {
    @Override
    public void writeLog() {
        System.out.println("writing file log...");
    }
}

DatabaseLog类

public class DatabaseLog extends Log {
    @Override
    public void writeLog() {
        System.out.println("writing database log...");
    }
}

LogFactory类

public abstract class LogFactory {
    public abstract Log createLog();
}

FileLogFactory类

public class FileLogFactory extends LogFactory {
    @Override
    public Log createLog() {
        return new FileLog();
    }
}

DatabaseLogFactory类

public class DatabaseLogFactory extends LogFactory {
    @Override
    public Log createLog() {
        return new DatabaseLog();
    }
}

XMLUtils类—使用DOM和Java反射机制读取XML信息

public class XMLUtils {
    public static String getClassName() {
        try {
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document doc = builder.parse(new File("src/config.xml"));
            Node classNode = doc.getElementsByTagName("class").item(0).getFirstChild();
            String type = classNode.getNodeValue().trim();
            return type;
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        return null;
    }
}

Client类—输出结果

public class Client {
    public static void main(String[] args) {
        try {
            Class<?> c = Class.forName(XMLUtils.getClassName());
            LogFactory factory = (LogFactory) c.newInstance(); 
            factory.createLog().writeLog();
        } catch (ClassNotFoundException e) {
            System.out.println("can not find class!");
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
}

以上就是笔者关于简单工厂模式的分析与实例展示。

如有错误,欢迎指出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值