设计模式之创建型模式

文章目录

    • 工厂模式
      • 1. 简单工厂
        • 1.1 角色及其职责
        • 1.2 UML类图
        • 1.3 产品工厂实例
        • 1.4 工厂使用
        • 1.5 简单工厂在框架中的应用
        • 1.6 优缺点
      • 2. 工厂方法(鸡肋)
      • 3. 抽象工厂模式
    • 单例模式
    • 建造者模式
        • 概念
        • 示例
        • 框架中的使用
    • 原型模式
      • 原型模式适用场景
      • 深克隆
        • 框架中的使用

工厂模式

1. 简单工厂

​ 简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式。

1.1 角色及其职责
角色 职责
工厂(Creator)角色 简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。
抽象产品(Product)角色 简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
具体产品(Concrete Product)角色 是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。
1.2 UML类图

​ 以笔者所在金融公司金融产品为例,不同的金融产品有这不同的‘授信’,‘借款’风控流程方法。
设计模式之创建型模式_第1张图片

  • CLProductService接口是金融产品顶层接口,该接口约束不同产品的授信、借款等方法
  • AbstractCLProductService 是针对CLProductService抽象事件,针对一些通用的方法进行实现比如注册、绑卡等。
  • DefaultCLProductService、DifferentCLProductService、StandardCLProductService具体的金融产品实现,主要针对不同产品的授信、借款流程进行具体的实现。
  • ProductFactory 具体的工厂对象,针对不同的产品类型获取对应的产品实现进行相关业务流程处理。
1.3 产品工厂实例
/**
 * @author xieqx
 * @className ProductFacotry
 * @desc 简单工厂类
 **/
public class ProductFacotry implements ApplicationContextAware {
   
    //产品bean实例名称后缀
    private static String serviceNameSubffix = "CLProductService";
    
    // spring上下文环境,用于从spring中获取产品对象
    private ApplicationContext applicationContext;

    /**
     *ProductTypeEnum 产品类型枚举 
     *基于spring容器获取厂产品
     */
    public CLProductService getSpringInstance(ProductTypeEnum productType){
   
        if(productType == null || StringUtils.isBlank(productType.getCode())){
   
            return new DefaultCLProductService();
        }
        StringBuffer buffer = new StringBuffer();
        //Standard + CLProductService
        buffer.append(productType.getCode()).append(serviceNameSubffix);
        //从spring中获取bean实例
        return applicationContext.getBean(buffer.toString(),CLProductService.class);
    }


    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
   
          this.applicationContext = applicationContext;
    }
}

1.4 工厂使用
 @Test
 public void simpleProductFactory(){
   
        //获取标准化理财产品
        CLProductService instance = productFacotry.getSpringInstance(ProductTypeEnum.STANDARD);
        instance.loan(null);

        //获取差异化产品
        CLProductService cashInstance = productFacotry.getSpringInstance(ProductTypeEnum.DIFFERENT

你可能感兴趣的:(设计模式,创建型模式,工厂模式,单例模式,构建者模式,原型模式)