上一篇关于设计模式中“简单工厂”模式的介绍让我们知道,它虽然有自己的优点,工厂类中包括了必要的逻辑判断,让客户端选择实例化相应的类,这样的好处就是除去了下具体实现的依赖,但是在我们也分析了在面临添加新功能时,它会违背设计模式里面的“开放-封闭”原则,于是引出了今天介绍的工厂方法模式,它相比简单工厂的不同之处就是它把选择实例化的类移到了客户端,这样的话在添加新功能时仅仅只需要添加新功能和修改相应的客户端组装代码即可,代码如下:
1 工厂抽象接口IOperationFactory.java
package com.ops.factory.method.base;
import com.ops.factory.Operation;
public interface IOperationFactory {
public Operation createOperation();
}
下面是与运算相关的具体工厂实现类
2 AddOperationFactory.java
package com.ops.factory.method.base;
import com.ops.factory.AddOperation;
import com.ops.factory.Operation;
public class AddOperationFactory implements IOperationFactory {
@Override
public Operation createOperation() {
return new AddOperation();
}
}
3 SubOperationFactory.java
package com.ops.factory.method.base;
import com.ops.factory.Operation;
import com.ops.factory.SubOperation;
public class SubOperationFactory implements IOperationFactory {
@Override
public Operation createOperation() {
return new SubOperation();
}
}
4 MultiOperationFactory.java
package com.ops.factory.method.base;
import com.ops.factory.MultiOperation;
import com.ops.factory.Operation;
public class MultiOperationFactory implements IOperationFactory {
@Override
public Operation createOperation() {
return new MultiOperation();
}
}
5 DivOperationFactory.java
package com.ops.factory.method.base;
import com.ops.factory.DivOperation;
import com.ops.factory.Operation;
public class DivOperationFactory implements IOperationFactory {
@Override
public Operation createOperation() {
return new DivOperation();
}
}
下面是客户端组装代码:
package com.ops.factory.method.main;
import org.junit.Test;
import com.ops.factory.Operation;
import com.ops.factory.method.base.AddOperationFactory;
import com.ops.factory.method.base.IOperationFactory;
public class FactoryMethodClient {
@Test
public void test() {
int numberA = 35;
int numberB = 7;
IOperationFactory opFactory = new AddOperationFactory();
Operation addOp = opFactory.createOperation();
int result = addOp.getResult(numberA, numberB);
System.out.println("resut = " + result);
}
}