本文共 3022 字,大约阅读时间需要 10 分钟。
简单工厂的最大优点是,工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。
但是当新增类的时候,需要在工厂类中添加新的分支条件,也就是需要修改原有的类。违背了开放-封闭原则。
定义一个用于创建对象的接口,让子类决定实例化哪一个类。
既然简单工厂的工厂类与具体对象的分支耦合, 那么就对它下手,根据依赖倒转原则,我们把工厂类 抽复出—个接口。这个接口只有—个方法,就是创建抽象产品的工厂方法。然后,所有的要生产具体类 的工厂,就去实现这个接口,这样,一个简单工厂模式的工厂类,变成了一个工厂抽象接口和多个具体生成对象的工厂,于是我们要增加’求 M 数的 N 次方’的功能时,就不需要更改原有的工厂类了,只需要增加此功能的运算类和相应的工厂类就可以了。从而保证了工厂和产品体系都没有修改的变化而只是扩展的变化,完全符合了开放封闭原则。
仍然存在的弊端
工厂方法模式实现时,客户端需要决定实例化哪—个工厂来实现运算类,选择判断的问题还是存在的,也就是说,工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行。想要加功能,本来是改工厂类的,而现在是修改客户端。
工厂方法克服了简单工厂违背开放-封闭原则的缺点,又保持了封装对象创建过程的优点。
简单工厂和工厂方法模式都是集中封装了对象的创建,要更换对象时,不需要做大的改动就可以实现,降低了客户程序和产品对象的耦合。
工厂方法时简单工厂模式的进一步抽象和推广,由于使用了多态性,工厂方法模式保持了简单工厂的优点,并且克服了其缺点。但是缺点是每加一个产品就需要增加一个产品工厂的类,增加了额外的开发量。
至于工厂方法这个需要客户端选择哪个工厂类的问题,可以用反射解决。
package com.factorymethod.entity;public class Operation { private double numberA=0; private double numberB=0; public double getNumberA() { return numberA; } public double getNumberB() { return numberB; } public void setNumberA(double numberA) { this.numberA = numberA; } public void setNumberB(double numberB) { this.numberB = numberB; } public double getResult(){ double result=0; return result; }}
package com.factorymethod.entity;public class OperationAdd extends Operation { @Override public double getResult() { double result=0; result=getNumberA()+getNumberB(); return result; }}
package com.factorymethod.entity;public class OperationSub extends Operation{ @Override public double getResult() { double result=0; result=getNumberA()-getNumberB(); return result; }}
package com.factorymethod.factory;import com.factorymethod.entity.Operation;public interface Factory { public Operation createOperation(); //注意这里}
package com.factorymethod.factory;import com.factorymethod.entity.Operation;import com.factorymethod.entity.OperationAdd;public class AddFactory implements Factory { @Override public Operation createOperation() { return new OperationAdd(); }}
产品子类2具体工厂(减法类工厂)
package com.factorymethod.factory;import com.factorymethod.entity.Operation;import com.factorymethod.entity.OperationSub;public class SubFactory implements Factory{ @Override public Operation createOperation() { return new OperationSub(); }}
package com.factorymethod.client;import com.factorymethod.entity.Operation;import com.factorymethod.factory.AddFactory;import com.factorymethod.factory.Factory;public class Client { public static void main(String[] args) { Factory factory=new AddFactory(); //这里需要客户端选择,是缺点 Operation operation=factory.createOperation(); //这里继承了简单工厂的优点,实现了产品对象的封装 operation.setNumberA(3.5); operation.setNumberB(5.7); double res=operation.getResult(); System.out.println("计算结果"+res); }}
转载地址:http://apfdi.baihongyu.com/