【设计模式】抽象工厂模式 ( 简介 | 适用场景 | 优缺点 | 产品等级结构和产品族 | 代码示例 )

举报
韩曙亮 发表于 2022/01/11 00:05:14 2022/01/11
【摘要】 文章目录 一、抽象工厂模式简介二、抽象工厂模式适用场景三、抽象工厂模式优缺点四、产品等级结构和产品族五、抽象工厂模式代码示例1、冰箱抽象类2、美的冰箱实现类3、格力冰箱实现类4、空调抽象类5、美的...





一、抽象工厂模式简介



抽象工厂模式 : 提供 一个 创建 一系列 相关 或 相互依赖 对象 的接口 ;

创建目标对象时 , 只需要直到对象的抽象类型或接口类型即可 , 不需要知道具体的实现类型 ;

抽象工厂模式类型 : 创建型 ;


抽象工厂模式 可以将 一组具有同一主题 , 单独的工厂 封装起来 ;
在使用时 , 客户端 创建 抽象工厂 的实现 , 使用 抽象工厂 作为接口 , 来创建这一主题的对象 ;
使用的时候 , 不需要知道 从内部 工厂方法中获得的 对象 的具体类型 ;
客户端 只 使用这些对象的 通用接口 ;

抽象工厂模式 实现了 一组对象的 实现细节使用 分离 ;





二、抽象工厂模式适用场景



抽象工厂模式适用场景 :

  • 忽略创建细节 : 客户端 不关心 产品实例 如何 被创建 , 实现等细节 ;
  • 创建产品族 : 强调 一系列 相关的 产品对象 , 一般是 同一个产品族 , 一起使用 创建对象需要大量重复的代码 ;
  • 产品类库 : 提供 一个 产品类 的库 , 所有的产品 以 同样的接口出现 , 使 客户端不依赖于具体实现 ;

使用抽象工厂模式 , 可以在工厂变化时 , 不需要修改 客户端 使用工厂的 代码 ;





三、抽象工厂模式优缺点



抽象工厂模式优点 :

  • 隔离产品代码 :应用层 隔离 具体产品的代码 , 客户端 无须关心 产品创建 的细节 ;
  • 创建产品族 :一个系列 的 产品族 , 统一到一起创建 ;

抽象工厂模式缺点 :

  • 扩展困难 : 规定了 所有 可能 被创建 产品集合 , 产品族扩展 新的产品 困难 , 需要 修改抽象工厂的接口 ;
  • 增加难度 : 增加了系统的 抽象性理解难度 ;




四、产品等级结构和产品族



下图中 , 有 椭圆形 , 圆形 , 正方形 , 三种产品 ;

  • 产品族 : 相同颜色的代表一个产品族 ;
  • 产品等级结构 : 相同形状的代表同一个产品等级结构 ;

在这里插入图片描述

如 : 方型 - 洗衣机 , 圆形 - 空调 , 椭圆 - 冰箱 ;

  • 横向 看 产品族 : 某 品牌下 有 方型 - 洗衣机 , 圆形 - 空调 , 椭圆 - 冰箱 , 这是一个产品族 ;
  • 纵向看产品等级结构 : 椭圆 - 冰箱 , 纵向指的是不同品牌的冰箱 ;

工厂方法模式 针对的是 产品等级结构 , 可以 扩展多个相同的产品 ;

抽象工厂模式 针对的是 产品族 , 在 某个品牌 的工厂中取出 洗衣机 类 , 取出的肯定是 该品牌的洗衣机实例对象 ;

只要指出 产品所在的 产品族 以及 产品所在的 产品等级结构 , 就可以唯一确定一个产品 ;


左侧的 纵坐标轴 上的 工厂 是 具体的工厂 , 从该具体的工厂中 创建的实例该产品族中的实例 ;

在这里插入图片描述


使用 工厂模式 还是 抽象工厂模式 , 要看具体的业务场景 ;
当一个工厂 可以 创建 分属于 不同 产品等级结构一个 产品族 中的 不同对象时 , 使用 抽象工厂模式 ;

如 :

  • 工厂 中可以创建 相同品牌的 洗衣机 , 冰箱 , 空调 等产品 , 使用 抽象工厂模式 ;
  • 如果 工厂中创建 不同品牌的空调 , 则使用 工厂方法模式 ;




五、抽象工厂模式代码示例



如果要新增 产品族 , 只需要增加 产品族工厂 , 对应的产品类 即可 ;
如果要新增 产品等级 , 很麻烦 , 需要修改所有的产品族工厂 , 这就违背了开闭原则 ;

产品等级结构固定 , 需要多个产品组合在一起形成产品族的 业务场景 , 适合使用抽象工厂模式 ;


业务场景 : 有两个电器品牌 , 美的 和 格力 ; 每个品牌下都有 冰箱 和 空调 产品 ;


1、冰箱抽象类


package abstractfactory;

/**
 * 冰箱抽象类
 */
public abstract class Fridge {
    public abstract void produce();
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

2、美的冰箱实现类


package abstractfactory;

/**
 * 美的冰箱
 */
public class MideaFridge extends Fridge {
    @Override
    public void produce() {
        System.out.println("生产美的冰箱");
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

3、格力冰箱实现类


package abstractfactory;

/**
 * 格力冰箱
 */
public class GreeFridge extends Fridge {
    @Override
    public void produce() {
        System.out.println("生产格力冰箱");
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

4、空调抽象类


package abstractfactory;

/**
 * 空调抽象类
 */
public abstract class AirConditioner {
    public abstract void produce();
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

5、美的空调实现类


package abstractfactory;

/**
 * 美的空调
 */
public class MideaAirConditioner extends AirConditioner {
    @Override
    public void produce() {
        System.out.println("生产美的空调");
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

6、格力空调实现类


package abstractfactory;

/**
 * 格力空调
 */
public class GreeAirConditioner extends AirConditioner {
    @Override
    public void produce() {
        System.out.println("生产格力空调");
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

7、工厂抽象接口 ( 重点 )


package abstractfactory;

/**
 * 抽象工厂方法
 */
public interface Factory {
    /**
     * 生产冰箱
     * @return
     */
    Fridge getFridge();

    /**
     * 生产空调
     * @return
     */
    AirConditioner getAirConditioner();
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

8、美的工厂实现类 ( 重点 )


package abstractfactory;

/**
 * 美的工厂
 */
public class MideaFactory implements Factory {
    @Override
    public Fridge getFridge() {
        return new MideaFridge();
    }

    @Override
    public AirConditioner getAirConditioner() {
        return new MideaAirConditioner();
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

9、格力工厂实现类 ( 重点 )


package abstractfactory;

/**
 * 格力抽象工厂
 */
public class GreeFactory implements Factory {
    @Override
    public Fridge getFridge() {
        return new GreeFridge();
    }

    @Override
    public AirConditioner getAirConditioner() {
        return new GreeAirConditioner();
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

10、测试类


package abstractfactory;

public class Main {
    public static void main(String[] args) {
        // 生产 美的 品牌的 冰箱 和 空调
        Factory mideaFactory = new MideaFactory();

        // 美的冰箱
        Fridge mideaFridge = mideaFactory.getFridge();
        mideaFridge.produce();

        // 美的空调
        AirConditioner mideaAirConditioner = mideaFactory.getAirConditioner();
        mideaAirConditioner.produce();

        System.out.println();

        // 生产 格力 品牌的 冰箱 和 空调
        Factory greeFactory = new GreeFactory();

        // 格力冰箱
        Fridge greeFridge = greeFactory.getFridge();
        greeFridge.produce();

        // 格力空调
        AirConditioner greeFridgeAirConditioner = greeFactory.getAirConditioner();
        greeFridgeAirConditioner.produce();
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

执行结果 :

生产美的冰箱
生产美的空调

生产格力冰箱
生产格力空调

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述

文章来源: hanshuliang.blog.csdn.net,作者:韩曙亮,版权归原作者所有,如需转载,请联系作者。

原文链接:hanshuliang.blog.csdn.net/article/details/119859243

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。