夜微凉、的博客

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  76 随笔 :: 24 文章 :: 22 评论 :: 24万 阅读

定义

抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又

称为Kit模式,属于对象创建型模式。

模式结构

这里写图片描述

使用场景

  • 客户端不依赖于产品类实例如何被创建、实现等细节
  • 强调一系列相关的产品对象(属于统一产品族)一起使用创建对象需要大量重复的代码
  • 提供一个产品类的库,所以的产品以同样的接口出现,从而使客户端不依赖具体实现

抽象工厂模式和工厂方法模式类似都是由四部分组成。

  • 抽象工厂(AbstractFactory)角色:担任这个角色的是抽象工厂模式的核心,是与应用系统的商业逻辑无关的。通常使用Java接口或者

抽象Java类实现。所有的具体工厂必须实现这个Java接口或继承这个抽象的Java类。

  • 具体工厂(Factory)角色:这个角色直接在客户端的调用下创建产品的实例,这个角色含有选择合适的产品对象的逻辑,而这个逻辑是

与应用系统商业逻辑紧密相关的。

  • 抽象产品(AbstractProduct)角色:担任这个角色的类是抽象工厂模式所创建的对象的父类,或它们共同拥有的接口。通常使用Java接

口或者抽象Java类实现这一角色。

  • 具体产品(Product)角色:抽象工厂模式所创建的任何产品对象都是一个具体的产品类的实例。这是客户端最终需要的东西,其内部一

优点

  •  抽象工厂模式隔离了具体类的生成,使得客户并不需要知道什么被创建。由于这种隔离,更换一个具体工厂就变得相对容易。所有的具体

工厂都实现了抽象工厂中定义的那些公共接口,因此只需改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。另外,应用

抽象工厂模式可以实现高内聚低耦合的设计目的,因此抽象工厂模式得到了广泛的应用。
当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象。这对一些需要根据当前环境来决

定其行为的软件系统来说,是一种非常实用的设计模式。

  • 增加新的具体工厂和产品族很方便,无须修改已有系统,符合“开闭原则”。

缺点

  • 在添加新的产品对象时,难以扩展抽象工厂来生产新种类的产品,这是因为在抽象工厂角色中规定了所有可能被创建的产品集合,要支持

新种类的产品就意味着要对该接口进行扩展,而这将涉及到对抽象工厂角色及其所有子类的修改,显然会带来较大的不便。

  • 开闭原则的倾斜性(增加新的工厂和产品族容易,增加新的产品等级结构麻烦)。
代码实例:
 抽象工厂(AbstractFactory)角色
复制代码
/**
 * 抽象工厂类
 */
public interface AbstractFactory {

    /**
     * 创建CPU
     *
     * @return
     */
    Cpu createCpu();

    /**
     * 创建硬盘
     *
     * @return
     */
    HardDisk createHardDisk();
}
复制代码

 具体工厂(Factory)角色

 
复制代码
/**
 * 联想电脑创造工厂
 */
public class LenovoFactory implements AbstractFactory {

    /**
     * 英特尔处理器
     *
     * @return
     */
    public Cpu createCpu() {
        return new IntelCpu();
    }

    /**
     * 希捷硬盘
     *
     * @return
     */
    public HardDisk createHardDisk() {
        return new WesternData();
    }
}


/**
 * 戴尔电脑-制造工厂
 */
public class DellFactory implements AbstractFactory {

    /**
     * AMD处理器
     *
     * @return
     */
    public Cpu createCpu() {
        return new AmdCpu();
    }

    /**
     * 希捷硬盘
     *
     * @return
     */
    public HardDisk createHardDisk() {
        return new WesternData();
    }
}
复制代码

抽象产品(AbstractProduct)角色

复制代码
/**
 * 产品接口-CPU
 */
public interface Cpu {

    /**
     * 输出CPU信息
     */
    void calculate();
}

/**
 * 产品接口-硬盘
 */
public interface HardDisk {

    /**
     * 输出硬盘信息
     */
    void calculate();
}
复制代码

具体产品(Product)角色:

复制代码
/**
 * AmdCPU
 */
public class AmdCpu implements Cpu {
    @Override
    public void calculate() {
        System.out.println("这是AMD处理器");
    }
}

/**
 * 英特尔CPU
 */
public class IntelCpu implements Cpu{
    @Override
    public void calculate() {
        System.out.println("这是英特尔处理器。");
    }
}

/**
 * 西部数据硬盘
 */
public class WesternData implements HardDisk {
    @Override
    public void calculate() {
        System.out.println("这是西部数据硬盘");
    }
}

/**
 * 希捷硬盘
 */
public class Seagate implements HardDisk {
    @Override
    public void calculate() {
        System.out.println("这是希捷硬盘!");
    }
}
复制代码

测试:

复制代码
@SpringBootTest
class AbstractFactoryTest {

    @Test
    public void test_01() {
        AbstractFactory lenovo = new LenovoFactory();
        AbstractFactory dell = new DellFactory();

        lenovo.createCpu().calculate();
        lenovo.createHardDisk().calculate();

        dell.createCpu().calculate();;
        dell.createHardDisk().calculate();
    }
}
复制代码

 

 
 
 
 

 

posted on   夜、微凉  阅读(56)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
点击右上角即可分享
微信分享提示