简单工厂模式最大的有点在于工厂类里包含了必要的逻辑判断条件,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。但是这违背了开放-封闭原则。
工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂
主要解决:主要解决接口选择的问题。
何时使用:我们明确地计划不同条件下创建不同实例时。
如何解决:让其子类实现工厂接口,返回的也是一个抽象的产品。
关键代码:创建过程在其子类执行。
方法模式是一个类的实例化延迟到其子类。
实例UML图:
代码实现如下,算法接口和实现类:
import lombok.Data;
/**
* @author Shuyu.Wang
* @package:com.shuyu.operation
* @className:
* @description:基本运算接口
* @date 2018-11-07 13:11
**/
public interface Operation {
public double getResult(double numberA,double numberB);
}
/**
* @author Shuyu.Wang
* @package:com.shuyu.operation
* @description:加法类
* @date 2018-11-07 13:32
**/
public class OperationAdd implements Operation{
@Override
public double getResult(double numberA,double numberB) {
double result=0;
result=numberA+numberB;
return result;
}
}
/**
* @author Shuyu.Wang
* @package:com.shuyu.operation
* @description:除法
* @date 2018-11-07 13:42
**/
public class OperationDiv implements Operation {
@Override
public double getResult(double numberA,double numberB) {
double result=0;
if (numberB==0){
try {
throw new Exception("除数不能为0");
} catch (Exception e) {
e.printStackTrace();
}
}else {
result=numberA/numberB;
}
return result;
}
}
/**
* @author Shuyu.Wang
* @package:com.shuyu.operation
* @description:乘法
* @date 2018-11-07 13:39
**/
public class OperationMul implements Operation{
@Override
public double getResult(double numberA,double numberB) {
double result=0;
result=numberA*numberB;
return result;
}
}
/**
* @author Shuyu.Wang
* @package:com.shuyu.operation
* @description:减法类
* @date 2018-11-07 13:35
**/
public class OperationSub implements Operation {
@Override
public double getResult(double numberA,double numberB) {
double result=0;
result=numberA-numberB;
return result;
}
}
工厂接口和实现类:
/**
* @author Shuyu.Wang
* @package:com.shuyu.factory
* @description:工厂接口
* @date 2018-11-13 23:52
**/
public interface IFactory {
Operation createOperation();
}
/**
* @author Shuyu.Wang
* @package:com.shuyu.factory
* @description:加法工厂
* @date 2018-11-13 23:53
**/
public class AddFactory implements IFactory{
@Override
public Operation createOperation() {
return new OperationAdd();
}
}
/**
* @author Shuyu.Wang
* @package:com.shuyu.factory
* @description:除法工厂类
* @date 2018-11-13 23:57
**/
public class DivFactory implements IFactory {
@Override
public Operation createOperation() {
return new OperationDiv();
}
}
/**
* @author Shuyu.Wang
* @package:com.shuyu.factory
* @description:乘法工厂
* @date 2018-11-13 23:56
**/
public class MulFactoty implements IFactory{
@Override
public Operation createOperation() {
return new OperationMul();
}
}
/**
* @author Shuyu.Wang
* @package:com.shuyu.factory
* @description:减法工厂类
* @date 2018-11-13 23:55
**/
public class SubFactory implements IFactory{
@Override
public Operation createOperation() {
return new OperationSub();
}
}
测试类如下:
@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class FactoryApplicationTests {
@Test
public void contextLoads() {
IFactory factory=new AddFactory();
Operation operation=factory.createOperation();
log.info("执行结果==="+operation.getResult(10,2));
}
}
代码github地址:https://github.com/iot-wangshuyu/designpatterns/tree/master/factory