java23种设计模式(二) -- 抽象工厂模式(创建型设计模式)

本文介绍了抽象工厂模式,它用于在不指定具体类的情况下创建一系列相关对象。通过一个中心工厂接口,实现了不同产品族的创建,如北方水果和蔬菜与南方水果和蔬菜。代码示例展示了如何使用抽象工厂模式,并强调了其在业务开发中的应用和优势,如单一职责、开闭原则和解耦。然而,随着业务扩展,可能会增加类的复杂性,但可以通过引入其他设计模式来缓解这个问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

抽象工厂模式介绍

抽象工厂模式与工厂方法模式虽然主要意图都是为了解决,接口选择问题。但在实现上,抽象工厂是一个中心工厂,创建其他工厂的模式

多个抽象产品类,派生出多个具体产品类;一个抽象工厂类,派生出多个具体工厂类;每个具体工厂类可创建多个具体产品类的实例。

即提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们的具体的类。“一对多”的关系

类结构图:

在这里插入图片描述

代码示例

项目目录结构
在这里插入图片描述

/**
 * 水果抽象接口
 */
public interface Fruit {

    void fruitInfo();
}

/**
 * 具体类:北方水果
 */
public class NorthFruit implements Fruit {
    @Override
    public void fruitInfo() {
        System.out.println("North-Apple");
    }
}

/**
 * 具体类:南方水果
 */
public class SouthFruit implements Fruit {
    @Override
    public void fruitInfo() {
        System.out.println("South-Banana");
    }
}
/**
 * 蔬菜抽象接口
 */
public interface Vegetable {

    void vegetableInfo();
}

/**
 * 具体类:北方蔬菜
 */
public class NorthVegetable implements Vegetable {
    @Override
    public void vegetableInfo() {
        System.out.println("North-Tomato");
    }
}

/**
 * 具体类:南方蔬菜
 */
public class SouthVegetable implements Vegetable {
    @Override
    public void vegetableInfo() {
        System.out.println("South-Taro");
    }
}
/**
 * 工厂抽象接口
 */
public interface Factory {

    Fruit createFruit();

    Vegetable createVegetable();
}

/**
 * 具体类:北方产品工厂
 */
public class NorthProductFactory implements Factory {
    @Override
    public Fruit createFruit() {
        return new North    Fruit();
    }

    @Override
    public Vegetable createVegetable() {
        return new NorthVegetable();
    }
}

/**
 * 具体类:南方产品工厂
 */
public class SouthProductFactory implements Factory {
    @Override
    public Fruit createFruit() {
        return new SouthFruit();
    }

    @Override
    public Vegetable createVegetable() {
        return new SouthVegetable();
    }
}

测试类

public class ApiTest {

    @Test
    public void testCommodity() throws Exception {
        Factory northFactory = new NorthProductFactory();
        Factory southFactory = new SouthProductFactory();

        System.out.println("北方产品:");
        northFactory.createFruit().fruitInfo();
        northFactory.createVegetable().vegetableInfo();

        System.out.println("南方产品:");
        southFactory.createFruit().fruitInfo();
        southFactory.createVegetable().vegetableInfo();
    }
}

在这里插入图片描述

总结

  • 抽象工厂模式,所要解决的问题就是在一个产品族,存在多个不同类型的产品情况下,接口选择的问题。而这种场景在业务开发中也是非常多见的,只不过可能有时候没有将它们抽象化出来。
  • 你的代码只是被ifelse埋上了!当你知道什么场景下何时可以被抽象工程优化代码,那么你的代码层级结构以及满足业务需求上,都可以得到很好的完成功能实现并提升扩展性和优雅度。
    那么这个设计模式满足了;单一职责、开闭原则、解耦等优点,但如果说随着业务的不断拓展,可能会造成类实现上的复杂度。但也可以说算不上缺点,因为可以随着其他设计方式的引入和代理类以及自动生成加载的方式降低此项缺点。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值