设计模式 03 抽象工厂模式

参考源

【狂神说Java】通俗易懂的23种设计模式教学(停更)_哔哩哔哩_bilibili

Java 设计模式 已完结(IDEA 2022.1最新版)4K蓝光画质+杜比音效_哔哩哔哩_bilibili


抽象工厂模式(Abstract Factory Pattern)属于创建型模式

抽象工厂模式是围绕一个超级工厂创建其他工厂,该超级工厂又称为其他工厂的工厂。

在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类,每个生成的工厂都能按照工厂模式提供对象。

前面的工厂模式通过定义顶层抽象工厂类,通过继承的方式,针对于每一个产品都提供一个工厂类用于创建。

不过这种模式只适用于简单对象,当需要生产许多个产品族的时候,这种模式就有点乏力了,比如:

image-20220521162444703

实际上这些产品都是成族出现的,比如小米的产品线上有小米手机、小米平板等,华为的产品线上也有华为手机、华为平板。

如果按照之前的工厂模式来进行设计,那就需要单独设计 9 个工厂来生产上面这些产品,显然这样就比较浪费时间的。

这时可以使用抽象工厂模式,将多个产品都放在一个工厂中进行生成,按不同的产品族进行划分。

比如小米,那么就创建一个小米工厂,这个工厂里面可以生产整条产品线上的内容,包括小米手机、小米平板等。

1、创建产品接口

/**
 * 手机
 */
public interface Phone {

    /**
     * 打电话
     */
    void call();

}
/**
 * 平板
 */
public interface Pad {

    /**
     * 看视频
     */
    void video();

}

2、定义具体产品

/**
 * 小米手机
 */
public class XiaoMiPhone implements Phone {
    
    @Override
    public void call() {
        System.out.println("小米手机打电话");
    }
}
/**
 * 小米平板
 */
public class XiaoMiPad implements Pad {


    @Override
    public void video() {
        System.out.println("小米平板看视频");
    }
}
/**
 * 华为手机
 */
public class HuaWeiPhone implements Phone {

    @Override
    public void call() {
        System.out.println("华为手机打电话");
    }
}
/**
 * 华为平板
 */
public class HuaWeiPad implements Pad {
    
    @Override
    public void video() {
        System.out.println("华为平板看视频");
    }
}

3、创建抽象工厂

/**
 * 抽象工厂
 */
public abstract class AbstractFactory {

    /**
     * 获取手机
     * @return 手机对象
     */
    public abstract Phone getPhone();

    /**
     * 获取平板
     * @return 平板对象
     */
    public abstract Pad getPad();

}

4、创建品牌工厂

/**
 * 小米工厂
 */
public class XiaoMiFactory extends AbstractFactory{


    @Override
    public Phone getPhone() {
        return new XiaoMiPhone();
    }

    @Override
    public Pad getPad() {
        return new XiaoMiPad();
    }
}
/**
 * 华为工厂
 */
public class HuaWeiFactory extends AbstractFactory {


    @Override
    public Phone getPhone() {
        return new HuaWeiPhone();
    }

    @Override
    public Pad getPad() {
        return new HuaWeiPad();
    }
}

5、生产使用

// 小米手机
Phone xiaomiPhone = new XiaoMiFactory().getPhone();
// 华为手机
Phone huaweiPhone = new HuaWeiFactory().getPhone();
// 小米平板
Pad xiaoMiPad = new XiaoMiFactory().getPad();
// 华为平板
Pad huaweiPad = new HuaWeiFactory().getPad();
// 输出测试
xiaomiPhone.call();
huaweiPhone.call();
xiaoMiPad.video();
huaweiPad.video();

输出结果为:

小米手机打电话
华为手机打电话
小米平板看视频
华为平板看视频

如此即实现了各工厂生产不同产品族的产品并实现对应的功能。

一个工厂可以生产同一个产品族的所有产品,这样按族进行分类,显然比之前的工厂模式更好。

不过,缺点还是有的,如果产品族新增了产品,那么我就不得不去为每一个产品族的工厂都去添加新产品的生产方法,违背了开闭原则。

且这种模式需要使用的类远多于工厂模式,除非是类似这种产品族的业务场景,否则还是更推荐工厂模式实现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天航星

感谢你的鼓励和认可

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值