简单工厂模式的好处我可以看出来 但是工厂方法模式 实在看不出来有啥好处 似乎在简单工厂方法上更进了,但是和直接new比起来又有什么优势呢,官方的说法 无论是书籍还是百度都查了很多,希望可以通过一个实例,来对比讲解一下,求解,实在百度什么的都查了,还是不太理解,所以才来提问,并不是没有思考就问
工厂有三种,简单工厂,工厂方法,抽象工厂。其中你问的应该是第二种工厂方法吧。工厂方法相比于其他两种方法完全支持开闭原则。所谓的开闭原则就是对扩展开放,对修改关闭,再说白点就是实现工厂方法以后要进行扩展时不需要修改原有代码,只需要增加一个工厂实现类和产品实现类就可以。这样的好处可以降低因为修改代码引进错误的风险
学习框架之后,才能真正理解各种设计模式
/**
* 一般写法,不用任何设计模式
* @param cacuType
* @param a
* @param b
* @return
*/
public double caculate(String cacuType,double a,double b){
double result=0;
if("add".equals(cacuType)){
result=a+b;
}else if("minus".equals(cacuType)){
result=a-b;
}
return result;
}
/**
* 工厂方法模式
* @param cacuType
* @param a
* @param b
* @return
*/
public double caculate3(String cacuType,double a,double b){
double result=0;
FactoryCaculate factory=null;
if("add".equals(cacuType)){
factory=new AddFactory();
}else if("minus".equals(cacuType)){
factory=new MinusFactory();
}
Caculate caculate=factory.createCaculate();
caculate.getResult(a, b);
return result;
}
这两种对比,第二种似乎比第一种更复杂蛋疼
刚想到一点,是不是因为工厂方法模式,将业务封装了,可以更好的复用,因为这里的业务很简单,如果复杂的话,每一次用都重写就很复杂,不过运用工厂方法模式了,就讲这些业务封装了,可以直接方法调用,就没那么麻烦呢
不过又有了新的纠结,简单工厂模式,就是将判断封装在了工厂里,根据判断实例化对象,那么这里和工厂方法模式又有啥劣势呢,说是打开扩展,关闭修改,不过如果新增一个caculate,都得修改呀,不过一个是修改工厂类,一个修改调用的地方,又有什么不同呢
我似乎有点明白了 不知道正确与否,如果新添加一个开发的,我已经明确我要添加一个开方并要使用开方,简单工厂模式由于判断在工厂里,是通过工厂类实例化,所以工厂类必须添加判断。而工厂方法模式可以直接创建开方类和开方工厂,别的不用修改,调用直接工厂方法那个类指向开方工厂类
工厂方法的好处是给创建实例提供了类似策略模式一样的处理方法。比如游戏引擎在导入外部贴图的时候,可以根据配置的压缩格式导入成不同的结果,比如图片基类Image有三个派生类TrueColorImage, CompressedImageETC, CompressedImageDXT, CompressedImagePVR分别代表原图、安卓平台压缩格式、PC平台压缩格式和Iphone压缩格式,游戏引擎在导入的时候根据引擎配置,选择对应的导入类(工厂),比如选了PC平台,它的工厂叫ImageDXTImporter,引擎会在启动的时候将ImageImporter指针指向工厂的实例,在后续导入图片的时候直接用这个基类指针的Import方法即可,不需要每次都读配置,走分支来判断用哪个Import方法来导入(就像简单工厂一样)。这时工厂方法最有用的地方,如果不需要这样的流程,其实用简单工厂就可以了。