工厂方法模式举个例子来说,加减乘除4个具体运算类(ConcreteProduct)其实就是依赖于抽象运算类(Product),而返回加减乘除具体运算类,又是由依赖于抽象运算工厂类(Creator)的加减乘除4个工厂类(ConcreteProduct)一对一返回。
而抽象工厂模式,假设车床生产两种不同的产品A跟产品B,那么车床可以当成一个工厂类,如此,当有车床A跟车床B都可以生产产品A跟产品B,那么车床A跟车床B操作方法不一样。使用车床A生产产品A(Product1 A)跟产品B(Product1 B)依赖于(AbstractProduct1),使用车床B生产产品A(Product2 A )跟产品B(Product2 B)依赖于(AbstractProduct2),而车床A(ConcreteFactoryA)跟车床B(ConcreteFactoryB)依赖于抽象车床(AbstractFactory),并有车床A跟B返回对应的产品A跟B的操作方法。其实也就是在工厂方法的基础上多了多个工厂,并这些工厂依赖于抽象工厂。如此当加产品C时,那么需要多出两个车床各自生成产品C的类,并且为抽象车床、车床A、车床B添加生成产品C的方法,又需要进行添加这些类,又需要修改,做法会显得很丑陋。
如此可以使用简单工厂模式+抽象工厂模式进行简化
使用简单工厂通过switch进行判断是使用车床A还是车床B进行生产,返回生产产品A跟产品B的方法,而客户端只需要调用简单工厂的创建产品方法,当需要更换车床时,只需要进入简单工厂设置switch参数即可,这样客户端的代码时可以不变动的。
这样就省去了抽象工厂模式上述繁多的类,还使得客户端代码可以省去改动。但是这样还是不完善的,当增加车床时,还是需要进入简单工厂中的switch添加case,没有做到“开放-封闭”。
这个时候可以使用反射+配置文件进行配合简单工厂中switch需要的参数,动态调用方法即可,这样只需要修改配置文件,代码完全不需要修改。代码参考:https://www.cnblogs.com/yulinfeng/p/5847733.html
总结自:《大话设计模式》抽象工厂模式