Skip to content
Go back

抽象工厂

Edit page

抽象工厂模式(Abstract Factory)

结构

picture 29

目的

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

考虑现实的工厂,工厂生产一件具体的产品需要用到许多零件等等,这些零件怎么来的用户不用关心,用户只需要关心如何从工厂中取出想要的产品即可。这个工厂就是抽象工厂。进一步说,用户其实也不关心产品具体是什么产品,比如说用户要从上海到北京,用户可以选择自己的 出行交通(抽象产品) ,飞机、汽车、高铁……,而对于汽车,其实用户不关心打的车是马自达还是卡宴,只要是四个轮能跑即可。而用户也不用关心是去 12345 买高铁票,还是去嘀嘀打车订专车,用户只需要跟一个 统一的交通平台(抽象工厂) 下单说明是要打车、高铁、飞机即可。

动机

考虑一个多种风格标准的 UI 包,为滚动条、弹出框、按钮等 UI 组件定义不同的外观和行为。为了保证风格的可移植性,一个应用不应该为他的前端界面硬编码固定风格的 UI 。为了做到一键换肤的效果,我们可以定义一个抽象的组件工厂类 WidgetFactory 类,这个类声明了一系列用来创建每一类基本组件的接口。每类窗口组件都有一个抽象类,由具体的子类实现了窗口组件的特定风格。这样接口的使用者不需要关心具体的 UI 风格,只要直接使用抽象组件类即可。

对于某一类风格的 UI 其组件是相互依赖的,如何创建相互依赖的组件呢?可以使用抽象工厂类的对应风格实现类,来创建对应风格的 UI 组件。用代码标识类似这种样子:

AbstractFactory factory = new SpecialFactory();
Window window = factory.createWindow(); // SpecialWindow
ScrollBar scrollBar = factory.createScrollBar(); // SpecialScrollBar

使用场景

要素

缺点

难以支持新种类产品的创建,如果要支持新的产品创建,则需要对所有实现类都跟随抽象工厂做修改。

解决方案,使用工厂方法(Factory Method)模式,通过传入希望得到的产品类型,具体的工厂实现类按照传入的类


Edit page
Share this post on:

Previous Post
Linux 文件与目录
Next Post
适配器模式