设计模式之抽象工厂模式
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式之抽象工厂模式相关的知识,希望对你有一定的参考价值。
工厂模式属于创建型设计模式,它提供了一种创建对象的最佳方式。
抽象工厂模式是工厂方法模式的升级版,是所有形态的工厂模式中最为抽象和最具一般性的一种形态。
定义:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定它们的具体类。
问题描述:使用工厂方法模式,产品类和工厂类一一对应,当种类过多的时候,将不利于系统的维护。
解决方案:使用一个抽象工厂来定义一个产品族,前提是这些产品必须存在相关或者相互依赖的关系。
结构图:
说明:
(1)抽象产品类(IProduct):抽象工厂模式中至少包含一个抽象产品类,每个抽象产品类派生出一个产品结构,定义了该产品结构中所有派生类的公开方法,方便于该产品的扩展;
(2)具体产品类:实现其对应的抽象产品类定义的方法;
(3)抽象工厂类(IFactory):声明了一组用于创建一个产品族的方法;
(4)具体工厂类:每个具体工厂类不再仅仅创建一个产品,而是由抽象工厂类定义的创建多个产品。
每一个模式都是针对一定问题的解决方案。工厂方法模式针对的是一个产品等级结构,而抽象工厂模式针对的是多个产品等级结构。
举个栗子:我喜欢养狗和猫,我养了两条狗,唤做黑黑和白白,还养了两只猫,唤做喵喵和呜呜,狗爱吃骨头,猫爱吃鱼。
根据抽象工厂模式的思想,我们这样来实现功能:
1. 两个抽象产品类:IDog和ICat,均定义两个方法introduce()和eatFood()。代码如下:
2. 具体产品类BlackDog和WhiteDog实现接口IDog。代码如下:
3. 具体产品类BlackCat和WhiteCat实现接口ICat。代码如下:
4. 一个抽象工厂类:AnimalFactory,声明一组用于创建一个产品族的方法(keepDog()和keepCat()),白狗和白猫、黑狗和黑猫。代码如下:
5. 两个具体工厂类:WhiteAnimalFactory()和BlackAnimalFactory(),前者负责生产白狗和白猫,后者负责生产黑狗和黑猫。代码如下:
6. 在类AbstractFactoryFragment中分别使用不同的工厂类生产出不同的多个产品对象,实现功能。代码如下:
7. 运行后的效果,如图所示:
综上所述,工厂方法可以看作是特殊情况下的抽象工厂,即只包含一个产品结构,每个产品族只有一个产品。抽象工厂模式也符合开闭原则,新增一个产品族时,仅需要增加具体的产品族和具体的工厂类。如果需要更改产品结构,那么就要去修改所有的工厂类,对扩展造成一定的难度。
优点:
(1)隔离了具体的类,并隐藏了一个产品族中产品的关联关系。如果要更改产品族,只要更换到对应的具体工厂上即可;
(2)有利于产品的一致性;
(3)新增一个产品族,无需更改原有的代码,符合开闭原则。
缺点:产品结构无法扩展,一旦扩展需要对原有的代码进行较大的修改,甚至需要修改抽象层代码。
使用场景:
(1)产品类型较多,但它们之间存在相关或互相依赖的关系,可以形成产品族类,且使用者不需要去关心产品对象如何创建、组合和表达的细节;
(2)系统的产品至少有一个产品族,而使用者只需要消费其中某一族的产品;
(3)产品等级结构稳定,后期不会出现结构上的更改。
总结:无论是简单工厂模式,工厂方法模式,还是抽象工厂模式,它们都属于工厂模式,最终的目的都是为了接耦,它们的使用方式都十分相似,可以相互转换,灵活演变,我们无需关心究竟使用哪种模式来实现,只要关心是否降低了耦合度就可以了。
以上是关于设计模式之抽象工厂模式的主要内容,如果未能解决你的问题,请参考以下文章