工厂模式之抽象工厂

本贴最后更新于 2648 天前,其中的信息可能已经渤澥桑田

工厂模式之抽象工厂

前言

简单工厂中我们解耦了对象创建职责和使用职责,将对象的创建分离到工厂类中,随之产生的问题是对象创建逻辑集中在一起并且越来越复杂,难以维护。为了解决这个问题,引入了抽象工厂的概念。即由抽象工厂统一对象创建行为,具体工厂负责创建每一种产品。在这种模式下,创建逻辑被分散到各个具体工厂中。但是问题又来了,随着产品的增多,工厂类和产品类成对增加。系统中增加了大量的类,导致系统越来越庞大和复杂,难以维护!

抽象工厂模式

前面提到的类数量激增问题是工厂方法模式的主要缺陷,那么有什么好的办法解决呢?在原来的工厂类中只存在一个或一组重载的对象创建方法,现在我们可以考虑将相关产品的创建放在一个工厂类中,这样一来工厂类的数量就会大大减少。什么是相关产品呢?这里要提一个产品族的概念。比如电脑相关的产品,有主机,显示器,键盘,鼠标。主机有很多品牌,显示器也有很多品牌,键盘鼠标同理。那么要生产一个电脑出来,就需要从这四个产品中各选一个品牌出来,这就是一个产品族。对应到工厂类就是具有产生这一组产品的方法。

简单代码示例:

/**
 *抽象产品
 */
interface MainFrame {} //主机

interface Displayer {} //显示器

interface Keybord {} //键盘

interface Mouse {} //鼠标

/**
 *抽象工厂
 */
interface Factory {
	//主机
	MainFrame getMainFrame();
	//显示器
	Displayer getDisplayer();
	//键盘
	Keybord getKeybord();
	//鼠标
	Mouse getMouse();
}

public static void main(String args[]) {
	
	Factory lenovoFactory = new LenovoFactory(); //获取一个联想电脑工厂
	//获取一组联想电脑组件,组成一台电脑
	lenovoFactory.getMainFrame();
	lenovoFactory.getDisplayer();
	lenovoFactory.getKeybord();
	lenovoFactory.getMouse();
	
	//这里省略了具体产品实现和工厂类实现
}

总结

抽象工厂模式可以说是工厂方法模式在具体场景下的延伸。由于它提供了更为强大的工厂类并且具备较好的扩展性,在软件开发中得到了广泛的应用,尤其是在一些框架和 API 类库的设计中例如 AWTJava 抽象窗口工具包)。

思考

抽象工厂模式可以保证系统在同一时刻使用的是一组相关的对象,而且在系统中增加一组相关对象以及对应工厂无需修改原有代码,符合 开闭原则,但是当修改产品族时不得不对抽象代码修改。所以抽象工厂模式适用于产品结构稳定的系统。

  • 设计模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

    200 引用 • 120 回帖 • 1 关注
  • 工厂模式
    6 引用

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...