1700457506
1700457507
其次,需要灵活的、可扩展的框架时,可以考虑采用工厂方法模式。万物皆对象,那万物也就皆产品类,例如需要设计一个连接邮件服务器的框架,有三种网络协议可供选择:POP3、IMAP、HTTP,我们就可以把这三种连接方法作为产品类,定义一个接口如IConnectMail,然后定义对邮件的操作方法,用不同的方法实现三个具体的产品类(也就是连接方式)再定义一个工厂方法,按照不同的传入条件,选择不同的连接方式。如此设计,可以做到完美的扩展,如某些邮件服务器提供了WebService接口,很好,我们只要增加一个产品类就可以了。
1700457508
1700457509
再次,工厂方法模式可以用在异构项目中,例如通过WebService与一个非Java的项目交互,虽然WebService号称是可以做到异构系统的同构化,但是在实际的开发中,还是会碰到很多问题,如类型问题、WSDL文件的支持问题,等等。从WSDL中产生的对象都认为是一个产品,然后由一个具体的工厂类进行管理,减少与外围系统的耦合。
1700457510
1700457511
最后,可以使用在测试驱动开发的框架下。例如,测试一个类A,就需要把与类A有关联关系的类B也同时产生出来,我们可以使用工厂方法模式把类B虚拟出来,避免类A与类B的耦合。目前由于JMock和EasyMock的诞生,该使用场景已经弱化了,读者可以在遇到此种情况时直接考虑使用JMock或EasyMock。
1700457512
1700457513
1700457514
1700457515
1700457517
设计模式之禅 8.4 工厂方法模式的扩展
1700457518
1700457519
工厂方法模式有很多扩展,而且与其他模式结合使用威力更大,下面将介绍4种扩展。
1700457520
1700457521
1.缩小为简单工厂模式
1700457522
1700457523
我们这样考虑一个问题:一个模块仅需要一个工厂类,没有必要把它产生出来,使用静态的方法就可以了,根据这一要求,我们把上例中的AbstarctHumanFactory修改一下,类图如图8-3所示。
1700457524
1700457525
1700457526
1700457527
1700457528
图8-3 简单工厂模式类图
1700457529
1700457530
我们在类图中去掉了AbstractHumanFactory抽象类,同时把createHuman方法设置为静态类型,简化了类的创建过程,变更的源码仅仅是HumanFactory和NvWa类,HumanFactory如代码清单8-13所示。
1700457531
1700457532
代码清单8-13 简单工厂模式中的工厂类
1700457533
1700457534
public class HumanFactory{
1700457535
1700457536
public static<T extends Human>T createHuman(Class<T>c){
1700457537
1700457538
//定义一个生产出的人种
1700457539
1700457540
Human human=null;
1700457541
1700457542
try{
1700457543
1700457544
//产生一个人种
1700457545
1700457546
human=(Human)Class.forName(c.getName()).newInstance();
1700457547
1700457548
}catch(Exception e){
1700457549
1700457550
System.out.println(“人种生成错误!”);
1700457551
1700457552
}
1700457553
1700457554
return(T)human;
1700457555
[
上一页 ]
[ :1.700457506e+09 ]
[
下一页 ]