您的位置:首页 > 其它

<五>读《《大话设计模式》》之工厂模式

2014-10-29 13:00 351 查看

怎么又是工厂模式呢?上次不是讲过简单工厂模式吗?不错,此工厂模式非彼工厂模式。

工厂模式:定义一个用于创建对象的接口,让子类决定实例化那一个类,工厂方法是一个类的实例化延迟到其子类。

还是以代码来进行比较吧

1、操作接口,与简单工厂模式一样

publicabstractclass Operation {

publicdoublenumberA;
publicdoublenumberB;

publicabstractdouble getResult();
}

2、相加、相减类与简单工厂模式一样

publicclass OperationAddextends Operation{

publicdouble getResult(){
returnnumberA +numberB;
}
}

publicclass OperationSubextends Operation{

publicdouble getResult(){
returnnumberA -numberB;
}
}

3、多了一个工厂接口

publicinterface IFactory {

OperationcreateOperation();
}

4、给每个算法都建立一个工厂,有了这个工厂之后,每个算法实例都分离开来,遵循了开闭原则,使代码结构更加清晰

给加法、减法一个工厂

publicclass AddFactoryimplements IFactory {

public Operation createOperation() {
//TODO Auto-generated method stub
returnnew OperationAdd();
}

}

publicclass SubFactoryimplements IFactory {

public Operation createOperation() {
//TODO Auto-generated method stub
returnnew OperationSub();
}

}

5有了这些工厂之后直接在客户端实例化想要的算法类就可以了(缺点耦合性差)

publicclass FatoryClient {

/**
* @param args
*/
publicstaticvoid main(String[] args) {
//TODO Auto-generated method stub

IFactoryfactory =
new
AddFactory();
Operationoperation = factory.createOperation();
operation.numberA = 3;
operation.numberB = 2;
double result = operation.getResult();
System.out.println("相加结果:"+result);

//我想调用另一个实例,仅仅在此newSubFactory()修改一下就可以了
IFactoryfactory2 =
new
SubFactory();
Operationoperation2 = factory2.createOperation();
operation2.numberA = 3;
operation2.numberB = 2;
double result2 = operation2.getResult();
System.out.println("相减结果:"+result2);
}
}

与简单工厂模式比较

比如我们要加一个算法:M的N次方,在简单工厂里面,我们先去加“M的N次方”功能类,然后去更改工厂方法,当中加case来判断调用;工厂模式呢,我们需要加“M的N次方”功能类,还要加该功能的工厂类,并且还要改客户端。看似麻烦了,其实不然,简单工厂最大的优点是工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态的实例化相关的类,对于客户端来说,去除了与具体产品的依赖。而工厂模式遵循了开闭原则,我添加业务需求不用修改原来的类的逻辑,直接添加新的逻辑就可以了。

最后附上工厂模式类图:



总结:工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在的,也就是说,工厂方法把简单工厂的内部逻辑判断移到了客户端代码来实现,你想加功能,本来是改工厂类的,而现在修改客户端。

附上源代码:http://download.csdn.net/detail/jzhf2012/8095101
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: