夜微凉、的博客

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

工厂方法模式有一个缺点,他的一个工厂只能生产一种产品,我们就引入的产品族的概念,产品族就是把产品分类,

比如:

联想的电脑可能采用英特尔的CPU和希捷的硬盘

戴尔的笔记本可能采用AMD的CPU和西部数据的硬盘

抽象工厂的模式角色分析:

1. 抽象的各种产品族(产品接口)

2. 集成各种产品族的具体实现类(具体产品)

3. 能生产各种产品族的抽象工厂(工厂接口)

4. 能生产不同品牌产品族的具体工厂(工厂接口的实现类)

抽象工厂有以下的优势:

1. 定义了某一族产品的规范后,具体产品只要按照规范来生产就好

2. 工厂能生产多种产品,这节约了资源。(这样不会工厂类爆炸),虽然这有点不符合开闭和单一职责,但是防止了类的爆炸

但是会有以下的劣势

1. 增加一个产品族,抽象工厂就要加一个抽象方法,具体工厂就要实现。违背了开闭原则。

2. 在具体工厂类的方法中,对于产品族里的产品,只能使用其中一个。这也比较容易理解,比如,一款车子不可以搭载两种空调。

代码实例:

CPU 抽象产品类 和  具体产品实现类

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

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

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

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

硬盘抽象产品类 和  具体产品实现类

复制代码
/**
 * 产品接口-硬盘
 */
public interface HardDisk {

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

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

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

抽象工厂类

复制代码
/**
 * 电脑工厂类
 */
public interface ComputerFactory {

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

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

生产不同品牌产品族的具体工厂

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

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

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

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

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

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

测试输出:

复制代码
@SpringBootTest
class ComputerFactoryTest {

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

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

        dell.createCpu().calculate();;
        dell.createHardDisk().calculate();;
    }
}
复制代码
这是英特尔处理器。
这是西部数据硬盘
这是AMD处理器
这是西部数据硬盘

 

posted on   夜、微凉  阅读(40)  评论(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语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
点击右上角即可分享
微信分享提示