工厂方法
针对上面的简单工厂,在增加新的支付方式时需要修改原有的代码,可能与开闭原则相违背,工厂方法遵循了开闭原则,直接贴图
1.还是原来的代码,alipay 和 wxpay 都实现了Pay接口
2.工厂方法我此处改了一下类名,但是内部的方法逻辑还是跟简单工厂一样的实现
3.工厂方法我此时增加了一个定义了一个创建Factory的接口,上面的 ThirdPartyFactory 已经实现了这个接口

4.此时我们需要直接对接银行接口,不再是第三方支付接口,那我不需要修改原有的ThirdParty相关代码。只需要去创建银行具体要对接的银行类,去实现Pay接口。比如当前需要对接工商银行和农业银行,那类似微信和支付宝一样,先实现Pay类。
5.然后再创建一个BankFactory 去实现 Factory
6.依次类推,我们可以创建很多具体的Factory的实现类,如果有新的需要对接的,我们只需要创建一组类似简单工厂的实现即可。此时遵循了开闭原则,不会修改原有的代码。此处举的例子不是很恰当,只需要理解工厂方法的思想即可。
7.此处再说一个可以省略Factory 和 Factory实现类的方式,只是我个人开发中会使用的

看上面的类的命名结尾都是Pay结尾,那此时可以使用反射,直接取到对应的类,不用再去创建每个工厂方法,再使用简单工厂逻辑去判断具体返回的类。
利用BeanFactory getBean 通过类名可反射获取到类

此时可以直接省略创建Factory 、BankFactory 和ThirdPartyFactory简化了很多代码,只需要调用pay接口,只需要传参如wx,通过拼接wxPay类名反射获取到 WxPay 对象,如果是支付宝只需要传参 ali,或icbc、abc。不需要再去定义多个工厂实现类。
此处两行代码可以替代BankFactory 和ThirdPartyFactory里面的逻辑代码

网友评论