新闻资讯

新闻资讯 媒体报道

Java面试专题:设计模式学习,详细分析工厂方法模式

编辑:005     时间:2020-11-04

工厂模式主要是为创建对象提供了接口。工厂模式按照《Java与模式》中的提法分为三类:
1. 简单工厂模式(Simple Factory)
2. 工厂方法模式(Factory Method)
3. 抽象工厂模式(Abstract Factory)

简单工厂模式(Simple Factory),比较简单,不再介绍,直接学习工厂方法模式。

工厂方法模式

简介:定义一个创建对象的接口,让子类决定实例化那个类。

工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个,也就是说工厂方法模式让实例化推迟到子类。

工厂方法模式非常符合“开闭原则”,当需要增加一个新的产品时,我们只需要增加一个具体的产品类和与之对应的具体工厂即可,无须修改原有系统。

同时在工厂方法模式中用户只需要知道生产产品的具体工厂即可,无须关系产品的创建过程,甚至连具体的产品类名称都不需要知道。

虽然他很好地符合了“开闭原则”,但是由于每新增一个新产品时就需要增加两个类,这样势必会导致系统的复杂度增加。其UML结构图:



代码实例

//抽象产品  abstract class Car{ private String name; public abstract void drive(); public String getName() { return name;  
    } public void setName(String name) { this.name = name;  
    }  
} //具体产品  class Benz extends Car{ public void drive(){  
        System.out.println(this.getName()+"----go-----------------------");  
    }  
} class Bmw extends Car{ public void drive(){  
        System.out.println(this.getName()+"----go-----------------------");  
    }  
} //抽象工厂  abstract class Driver{ public abstract Car createCar(String car) throws Exception;  
} //具体工厂(每个具体工厂负责一个具体产品)  class BenzDriver extends Driver{ public Car createCar(String car) throws Exception { return new Benz();  
    }  
} class BmwDriver extends Driver{ public Car createCar(String car) throws Exception { return new Bmw();  
    }  
} //老板  public class Boss{ public static void main(String[] args) throws Exception {  
        Driver d = new BenzDriver();  
        Car c = d.createCar("benz");   
        c.setName("benz");  
        c.drive();  
    }  
}

应用场景

1、工厂方法模式是new一个对象的替代品,所以在所有需要生成对象的地方都可以使用,但是需要慎重地考虑是否要增加一个工厂类进行管理,增加代码的复杂度。

2、需要灵活的、可扩展的框架时,可以考虑采用工厂方法模式。万物皆对象,那万物也就皆产品类,例如需要设计一个连接邮件服务器的框架,有三种网络协议可供选择:POP3、IMAP、HTTP,我们就可以把这三种连接方法作为产品类,定义一个接口如IConnectMail,然后定义对邮件的操作方法,用不同的方法实现三个具体的产品类(也就是连接方式)再定义一个工厂方法,按照不同的传入条件,选择不同的连接方式。如此设计,我们做到完美的扩展,如某些邮件服务器提供了WebService接口,很好,我们只要增加一个产品类就可以了。

3、工厂方法模式可以用在异构项目中,例如通过WebService与一个非Java项目交互,虽然WebService号称是可以做到异构系统的同构化,但是在实际的开发中,还是会碰到很多问题,如类型问题、WSDL文件的支持问题,等等。从WSDL中产生的对象都认为是一个产品,然后由一个具体的工厂类进行管理,减少与外围系统的耦合。

4、可以使用在测试驱动开发的框架下。例如,测试一个类A,就需要把与类A有关联关系的类B也同时产生出来,我们可以使用工厂方法模式把类B虚拟出来,避免类A与类B的耦合。目前由于JMock和EasyMock的诞生,该使用场景已经弱化了,遇到这种情况时直接考虑使用JMock或EasyMock。

本内容属于网络转载,文中涉及图片等内容如有侵权,请联系编辑删除



郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

回复列表

相关推荐