工厂模式

简单工厂模式最大的有点在于工厂类里包含了必要的逻辑判断条件,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。但是这违背了开放-封闭原则。

工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂

主要解决:主要解决接口选择的问题。

何时使用:我们明确地计划不同条件下创建不同实例时。

如何解决:让其子类实现工厂接口,返回的也是一个抽象的产品。

关键代码:创建过程在其子类执行。

方法模式是一个类的实例化延迟到其子类。

 

实例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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值