创建——抽象工厂模式

抽象工厂英文 abstract factory

名词需要分成两个部分读,抽象 工厂。

首先这是一个工厂,其次工厂是抽象的。

常用于需要针对不同情况创建不同(一组包含多个)对象的情况中。

如:

如gui应用中的首页中都有更换皮肤的功能,更换皮肤通常需要修改导航栏的样式,首页背景图等。假设这些样式封装在三个不同的对象中,对象导航栏和对象首页。(为了让表述简单这里只分两个部分)

 Widget中文名即窗口组件。

客户端是Client,其中调用的是WidgetFactory接口和Index接口,Navigation接口。

而WidgetFactory接口有两个实现类,分别是蓝色组件和黑色组件,因为接口规定了创建首页index和创建导航栏navigation两个方法,所以对应的两个工厂实现类也有两个对应创建方法,分别是创建自己工厂对应样式的组件。

创建的对应实现类也有对应的接口。

扫描二维码关注公众号,回复: 3658311 查看本文章

这样如果在调用端需要修改组件样式的话,只需要在声明工厂的地方切换实现类即可。

这里要注意的是,对应的工厂实现类实例通常是单例的,因为整个进程中通常只需要一个工厂实例就够了。而产品要看实际情况。

抽象化类图:

concrete是具体实现的意思,即实现类。如果是java的,可以当做是下图

定义了工厂接口类和创建方法的接口。实现类实现了工厂接口和对应方法,这些产品都有对应的接口。

在客户端中值调用接口类,而产品类的选择是在工厂中完成的,客户端中接触不到具体的实例化过程。

模式优点:

分离了具体类:产品的具体实现被分割出来,被工厂封装起来, 不出现在具体客户端代码中。

易于切换:如果要切换样式,在声明的地方切换工厂实现类即可。

一致性:可以统一管理一组产品,产品之间可以协同工作。

模式缺点:

不易于扩展新的产品:如果需要新增一个表单样式,那么抽象工厂类需要加接口,所有的实现类也需要加接口。

缺点修复:

可以为接口类只定义一个接口方法:make(Parameter),参数可以是一个类,标识符或者字符串,而创建的产品根据参数变化而变化。这样添加新的产品只需要在实现方法中做调整。

但是这个涉及到一个类型向下转换的问题,返回类中可能存在一些安全检查和强制转换的问题。

猜你喜欢

转载自blog.csdn.net/a397525088/article/details/82817612