抽象工厂模式

设计模式 总目录

https://preparedata.blog.csdn.net/article/details/134512591

文章目录

    • [设计模式 总目录](#设计模式 总目录)
    • 一、案例
    • [二、抽象类 AbstractOrder (顶层的订单抽象类)](#二、抽象类 AbstractOrder (顶层的订单抽象类))
    • 三、生产厂家的实现类
      • [3.1 北方厂家 NorthOrder](#3.1 北方厂家 NorthOrder)
      • [3.2 南方厂家 SouthOrder](#3.2 南方厂家 SouthOrder)
    • 四、单一生产厂家的生产业务线
      • [4.1 北方厂家的帽子 NorthHatOrder](#4.1 北方厂家的帽子 NorthHatOrder)
      • [4.2 北方厂家的鞋子 NorthShoeOrder](#4.2 北方厂家的鞋子 NorthShoeOrder)
      • [4.3 南方厂家的帽子 SouthHatOrder](#4.3 南方厂家的帽子 SouthHatOrder)
      • [4.4 南方厂家的鞋子 SouthShoeOrder](#4.4 南方厂家的鞋子 SouthShoeOrder)
    • 五、调用

一、案例

在的下单业务中,对于不同的类型的商品(鞋子、帽子),包含南方、北方生产厂商, 两个厂商都可以生产鞋子、帽子。

这时候可以利用抽象工厂模式,依据不同的厂商和商品类型,调用不同的处理器,进行下单

1.定义 抽象类 AbstractOrder 定义声明下单方法, 实现公共下单逻辑; 可以获取厂商&商品类型的实例, 也可以获取商品类型的实例;

2.定义 实现类 NorthOrder(北方厂商)SouthOrder(南方厂商)继承AbstractOrder, 实现厂商下单逻辑, 同时也可以调用父级AbstractOrder的公共方法

3.定义 子类 NorthHatOrder(北方厂商-帽子产线)NorthShoeOrder(北方厂商-鞋子产线)SouthHatOrder(南方厂商-帽子产线)SouthShoeOrder(南方厂商-帽子产线) 继承NorthOrder(北方厂商)、SouthOrder(南方厂商)

实现厂商&商品类型下单逻辑, 同时也可以调用父级的公共方法

当生产厂商、商品类型更多的时候,添加实现类,能够利用拆分不同的下单业务,约束接口, 抽取公共方法,统一参数等

个人理解,抽象工厂和简单工厂目的大体相同,都是在于业务执行器的选择,也就是if else 的处理

抽象工厂是更多是一个在if else 中嵌套if else处理的过程。

二、抽象类 AbstractOrder (顶层的订单抽象类)

java 复制代码
package com.pd.shopping.order.designptern.abstractfactory;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.Map;

/**
 * @author hll
 */
@Slf4j
@Component
public abstract class AbstractOrder {

    /**
     * 获取南方、北方工厂
     * @param orderRegion
     * @return
     */
    public static AbstractOrder getInstance(String orderRegion) {
        switch (orderRegion){
            case "north":
            	//可以利用一些获取Bean的工具获取, 避免new
                //SpringApplicationUtil.getBean(ShoeOrder.class);
                return new NorthOrder();
            case "south":
                return new SouthOrder();
            default:
                return null;
        }
    }

    /**
     * 获取南方、北方工厂 下的帽子、或鞋子业务线
     * @param orderRegion
     * @param orderType
     * @return
     */
    public static AbstractOrder getInstance(String orderRegion, String orderType){
    	//可以利用一些枚举值, 避免拼接
        switch (orderRegion + "-" + orderType){
            case "north-hat":
            	//可以利用一些获取Bean的工具获取, 避免new
                //SpringApplicationUtil.getBean(ShoeOrder.class);
                return  new NorthHatOrder();
            case "north-shoe":
                return  new NorthShoeOrder();
            case "south-hat":
                return new SouthHatOrder();
            case "south-shoe":
                return new SouthShoeOrder();
            default:
                return null;
        }
    }

    /**
     * 创建订单
     * @param map
     */
    public abstract void create(Map<String,Object> map);

    /**
     * 查询
     * @param map
     */
    public abstract void query(Map<String,Object> map);

    /**
     * 公共方法
     */
    public void common(){
        log.debug("调用公共方法");
    }
}

三、生产厂家的实现类

3.1 北方厂家 NorthOrder

java 复制代码
package com.pd.shopping.order.designptern.abstractfactory;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.Map;

/**
 * @author hll
 */
@Slf4j
@Component
public class NorthOrder extends AbstractOrder {


    /**
     * 帽子公共方法
     */
    public void northCommon(){

    }

    @Override
    public void create(Map<String, Object> map) {

    }

    @Override
    public void query(Map<String, Object> map) {

    }
}

3.2 南方厂家 SouthOrder

java 复制代码
package com.pd.shopping.order.designptern.abstractfactory;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.Map;

/**
 * @author hll
 */
@Slf4j
@Component
public class SouthOrder extends AbstractOrder {


    /**
     * 帽子公共方法
     */
    public void southCommon(){

    }

    @Override
    public void create(Map<String, Object> map) {

    }

    @Override
    public void query(Map<String, Object> map) {

    }
}

四、单一生产厂家的生产业务线

4.1 北方厂家的帽子 NorthHatOrder

java 复制代码
package com.pd.shopping.order.designptern.abstractfactory;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.Map;

@Slf4j
@Component
public class NorthHatOrder extends NorthOrder {

    /**
     * 创建订单
     * @param map
     */
    @Override
    public void create(Map<String,Object> map){
        super.northCommon();
        super.common();
        log.debug("创建鞋子订单");
    }


    /**
     * 查询
     * @param map
     */
    @Override
    public void query(Map<String,Object> map){
        super.northCommon();
        super.common();
        log.debug("查询鞋子订单");
    }
}

4.2 北方厂家的鞋子 NorthShoeOrder

java 复制代码
package com.pd.shopping.order.designptern.abstractfactory;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.Map;

@Slf4j
@Component
public class NorthShoeOrder extends NorthOrder {
    /**
     * 创建订单
     * @param map
     */
    @Override
    public void create(Map<String,Object> map){
        super.northCommon();
        super.common();
        log.debug("创建鞋子订单");
    }


    /**
     * 查询
     * @param map
     */
    @Override
    public void query(Map<String,Object> map){
        super.northCommon();
        super.common();
        log.debug("查询鞋子订单");
    }
}

4.3 南方厂家的帽子 SouthHatOrder

java 复制代码
package com.pd.shopping.order.designptern.abstractfactory;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.Map;

@Slf4j
@Component
public class SouthHatOrder extends SouthOrder {
    /**
     * 创建订单
     * @param map
     */
    @Override
    public void create(Map<String,Object> map){
        super.southCommon();
        super.common();
        log.debug("创建鞋子订单");
    }

    /**
     * 查询
     * @param map
     */
    @Override
    public void query(Map<String,Object> map){
        super.southCommon();
        super.common();
        log.debug("查询鞋子订单");
    }
}

4.4 南方厂家的鞋子 SouthShoeOrder

java 复制代码
package com.pd.shopping.order.designptern.abstractfactory;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.Map;

@Slf4j
@Component
public class SouthShoeOrder extends SouthOrder {
    /**
     * 创建订单
     * @param map
     */
    @Override
    public void create(Map<String,Object> map){
        super.southCommon();
        super.common();
        log.debug("创建鞋子订单");
    }


    /**
     * 查询
     * @param map
     */
    @Override
    public void query(Map<String,Object> map){
        super.southCommon();
        super.common();
        log.debug("查询鞋子订单");
    }
}

五、调用

java 复制代码
	@GetMapping("/abstractFactoryOrder")
    public void abstractFactoryOrder() {
        //获取南方、北方工厂 下的帽子、或鞋子业务线
        AbstractOrder.getInstance("north","hat").create(new HashMap<>());
        AbstractOrder.getInstance("south","hat").create(new HashMap<>());

        //获取南方、北方工厂 下的业务线
        AbstractOrder.getInstance("north").create(new HashMap<>());
        AbstractOrder.getInstance("south").create(new HashMap<>());

    }
相关推荐
帅次25 分钟前
基于 Web 的工业设备监测系统:非功能性需求与标准化数据访问机制的架构设计
设计模式·重构·软件工程·软件构建·需求分析·代码规范·设计规范
仙魁XAN2 小时前
Unity 设计模式 之 创建型模式 -【单例模式】【原型模式】 【建造者模式】
unity·单例模式·设计模式·建造者模式·原型模式
工程师老罗6 小时前
Java笔试面试题AI答之设计模式(4)
java·开发语言·设计模式
18你磊哥7 小时前
java重点学习-设计模式
java·学习·设计模式
蔚一11 小时前
Java设计模式(单例模式)——单例模式存在的问题(完整详解,附有代码+案例)
java·开发语言·单例模式·设计模式
严文文-Chris12 小时前
【设计模式-备忘录】
java·设计模式
岁岁岁平安16 小时前
《飞机大战游戏》实训项目(Java GUI实现)(设计模式)(简易)
后端·游戏·设计模式·飞机大战·java-gui
丶白泽18 小时前
重修设计模式-结构型-适配器模式
前端·设计模式·适配器模式
CV猿码人18 小时前
设计模式-适配器模式
java·设计模式·适配器模式
极地星光18 小时前
设计模式-适配器模式
c++·设计模式·适配器模式