抽象工厂模式
等级接口
使用抽象工厂模式的时候,首先需要把同一等级下的不同对象划分出来,我们以后就称其为划分等级,划分等级的过程如下:
首先写一个能够代表这一等级的接口,如下图:
实现等级接口的抽象类
然后要定义这一等级下不同对象的抽象类,如下图:
继承抽象类的族类
根据不同的族,实现抽象类,如下图:
颜色是红色的族,实现抽象类:
颜色是蓝色的族实现抽象类:
定义抽象工厂
定义一个抽象工厂,如下图:
定义具体工厂
通过不同的族来创建具体的工厂,如下图:
测试
抽象工厂模式中各个属性的解释
抽象工厂:声明一组用于创建一族产品的方法,比如本例一族产品就代表红色特斯拉,红色五菱宏光,一族即都是红色,产品包含这一等级下的所有的产品,即汽车等级下的特斯拉和五菱宏光。
具体工厂:具体工厂实现了抽象工厂,每个工厂方法返回一个具体对象,一个具体工厂所创建的具体对象构成了一个族如:RedCarFactory这个具体工厂可以创建红色特斯拉,红色五菱宏光。具体工厂可以生产统一系列的所有对象。
抽象类接口:提供一组所有类都具有的业务方法。
抽象类:用于实现抽象类接口所定义的业务方法,但是该角色对于抽象接口定义的方法只做抽象实现,即所有实现都被定义为抽象方法,最终的具体实现全部交给具体类实现。抽象类主要是将统一等级下的不同产品划分结构。
具体类:该角色继承抽象类,不同族的业务方法的实现。
什么时候使用抽象工厂模式呢?
当有很多产品,但是这些产品有共同的特征的时候,就可以使用抽象工厂模式。其中这些共同的特征就是族,比如它们都是红色或蓝色,这些产品就是统一等级下的不同产品,比如汽车等级下的产品:特斯拉,五菱宏光。
抽象工厂模式是不满足开闭原则的
目前我们的程序中,可以获取到红色Red和蓝色Blue两种颜色的特斯拉和五菱宏光车辆,如果现在程序需要拓展了,比如说想要获取到白色White的特斯拉和五菱宏光车辆,那么我们只需要写两个实现类WhiteTesla和WhiteWuLing,其中WhiteTesla实现类实现了Tesla抽象类,而WhiteWuLing实现类实现了WuLing抽象类。最后再写一个WhiteCarFactory工厂实现抽象工厂CarFactory就可以了。这样看似满足开闭原则,即不修改原来的代码,只是在原来的代码之上进行扩展,但是仔细想一想。如果你想要扩展的不是一个族(这里不同的颜色表示不同的族,增加白色,就相当于是扩展一个族),而是扩展的这一等级下的对象,比如说你想要增加一个奥迪车辆,那么你就不得不要修改抽象工厂CarFactory了,需要在里面添加一个奥迪车辆。
抽象工厂模式的优缺点
优点:
具体产品在应用层的代码隔离,无需关心创建的细节
将一个系列的产品统一到一起创建
缺点:
规定了所有可能被创建的产品集合,产品簇中扩展新的产品困难
增加了系统的抽象性和理解难度
抽象工厂模式:不可以增加产品,可以增加产品族。