同上一个简单工厂模式一样,都是那计算器来说事,先看UML图。
在客户端(form1)中,通过对工厂子类的实现来操作具体的计算类。
Factory Method:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
和简单工厂模式不同的是这里把一个大的工厂(原先用来控制所有具体计算类)分解为了相应的小工厂,并且把实例化的过程放到了子类中来实现。
如果说在简单工厂模式中要添加一个新的类比如说M开N次方类,需要修改的地方为工厂内部的判断逻辑。
相应的放在工厂方法中时,对于所有类不用做任何修改,这样就遵循了开闭原则。不过工厂方法中的逻辑判断是放在客户端来进行的,所以要改动客户端中的判断。
思考:如果说我的简单工厂中通过反射机制来进行类的生成(这样就可以不用if—else或者是select case)因此也就不会因为新加一个类而改变其他类,这也遵循了开闭原则。相应的在工厂方法中通过反射也一样可以不对原有类进行改变,那么这样来说简单工厂和工厂方法哪个更好一些呢?相比较来说工厂方法反而麻烦了。
引用《Head First设计模式》中关于工厂方法模式的话:“我可以把你的客户端代码从需要实例化的具体类中解耦。或者如果你目前还不知道将来要实例化哪些具体类时,也可以用我。我的使用方法很简单,只要把我继承成子类,并实现我的工厂方法就可以了。”
关于简单工厂和工厂方法模式的比较不是很理解,下面给出vb.net版的工厂方法模式代码:
客户端:
工厂类:
运算类:
PS:又好好看了一下工厂方法,原来就是在从简单工厂中在抽象出来一个抽象的工厂类 ,这样灵活性就更高了。