通俗易懂的java设计模式(5)-抽象工厂模式

抽象工厂模式是一种创建型设计模式,提供了一种创建对象的最佳方式。它允许创建产品族的实例,而无需指定其具体类。文章通过苹果和华为的产品为例,展示了如何通过抽象工厂创建不同品牌的产品,如手机和平板,并讨论了模式的优缺点,包括产品等级易于扩展但产品族扩展困难。此外,还提到了在Spring框架中BeanFactory作为工厂的父类的应用。
摘要由CSDN通过智能技术生成

什么是抽象工厂模式?

抽象工厂模式,可以说是工厂模式的升级版

关于工厂模式:通俗易懂的工厂模式

抽象工厂:围绕着一个超级工厂去创建其他的工厂,这个超级工厂也被称为工厂的工厂,这个设计模式属于创建型模式,提供了一种创建对象的最佳方式

  • 相关的概念

产品族:某个品牌下面的所有产品,比如苹果下的手机、平板就是同一产品族

产品等级:不同品牌下面的同种产品,比如苹果的手机和华为的手机就是同一产品等级

简单的代码实现

场景描述:苹果和华为都有手机产品和平板产品,在客户端调用时,我们需要直接用工厂接口创建需要的苹果和华为工厂,从而拿到想要的产品

下面代码的整体架构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6EsIHoBk-1672990742561)(documents/笔记/images/image-20230106152453596.png)]

  • 手机和平板是两个产品,所以我们先创建两个抽象产品接口
/**
 * 手机产品
 */
public interface PhoneProduct {
    void start();
}
/**
 * 平板产品
 */
public interface PadProduct {
    void start();
}
  • Iphone,Ipad,HuaweiMate,HuaweiPad四个产品的具体产品实现类
public class Iphone implements PhoneProduct {
    @Override
    public void start() {
        System.out.println("您正在使用iphone系列产品");
    }
}
public class Ipad implements PadProduct{
    @Override
    public void start() {
        System.out.println("您正在使用ipad系列产品");
    }
}
public class HuaweiMate implements PhoneProduct{
    @Override
    public void start() {
        System.out.println("您正在使用HuaweiMate系列产品");
    }
}
public class HuaweiPad implements PadProduct{
    @Override
    public void start() {
        System.out.println("您正在使用HuaweiPad系列产品");
    }
}
  • 接下来就是超级工厂的抽象实现
public interface SuperProductFactory {
    //获取手机产品
    PhoneProduct getphoneProduct();
    //获取平板产品
    PadProduct getpadProduct();
}
  • 苹果和华为是两个不同的品牌,所以他们两个各自都有一个各自的工厂类
public class AppleFactory implements SuperProductFactory{
    @Override
    public PhoneProduct getphoneProduct() {
        return new Iphone();
    }

    @Override
    public PadProduct getpadProduct() {
        return new Ipad();
    }
}
public class HuaweiFactory implements SuperProductFactory{
    @Override
    public PhoneProduct getphoneProduct() {
        return new HuaweiMate();
    }

    @Override
    public PadProduct getpadProduct() {
        return new HuaweiPad();
    }
}
  • 最后就是客户端了,可以直接用超级工厂来创建品牌工厂,从而得到需要的产品
public class Client {
    public static void main(String[] args) {
        /**
         * 利用苹果工厂,得到苹果产品
         */
        SuperProductFactory apple = new AppleFactory();

        PhoneProduct iphone = apple.getphoneProduct();
        PadProduct ipad = apple.getpadProduct();
        iphone.start();
        ipad.start();

        /**
         * 利用华为工厂,得到华为产品
         */
        SuperProductFactory huawei = new HuaweiFactory();
        PhoneProduct huaweiMate = huawei.getphoneProduct();
        PadProduct huaweiPad = huawei.getpadProduct();
        huaweiMate.start();
        huaweiPad.start();
    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-12QQ92xV-1672990742562)(documents/笔记/images/image-20230106144838502.png)]

抽象工厂模式的优缺点

  • 优点:产品等级容易扩展

假设我们现在有一个新的品牌三星,也可以生产手机和平板,我们扩展的时候是不用修改原来的代码的,只需要新增工厂实现类和产品实现类即可。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G2dETkXX-1672990742563)(documents/笔记/images/image-20230106153015114.png)]

  • 缺点:产品族难扩展

假如说苹果和华为除了手机和平板之外扩充了新的业务,又开始造耳机了,那么我们不仅要增加产品接口,还需要修改顶层的工厂类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t6r1WkUy-1672990742563)(documents/笔记/images/image-20230106153300721.png)]

抽象工厂模式在java中的应用

  • 在spring中,BeanFactory是所有工厂的父类,这样就可以根据不同的策略调用getBean方法,从而获取具体的对象

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kyWhbnPN-1672990742563)(documents/笔记/images/image-20230106153822258.png)]
外链图片转存中...(img-t6r1WkUy-1672990742563)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值