创建型模式(三):抽象工厂模式

本文介绍了抽象工厂模式,它是工厂方法模式的扩展,适用于处理多个产品等级结构。通过实例展示了如何使用抽象工厂模式创建产品族,如不同品牌的SUV车型。当需要扩展产品族或等级结构时,抽象工厂模式遵循了"开闭原则",方便扩展而不影响现有代码。此外,还讨论了在Objective-C中的应用,并提到了 NSNumber 类作为抽象工厂模式的一个例子。
摘要由CSDN通过智能技术生成

抽象工厂模式

是什么

是工厂方法设计模式的一种扩展。当有多个抽象角色时,使用的一种工厂模式。

img

抽象工厂

  • AbstractFactory(抽象工厂):它声明了一组用于创建一族产品的方法,每一个方法对应一种产品。
  • ConcreteFactory(具体工厂):它实现了在抽象工厂中声明的创建产品的方法,生成一组具体产品,这些产品构成了一个产品族,每一个产品都位于某个产品等级结构中。
  • AbstractProduct(抽象产品):它为每种产品声明接口,在抽象产品中声明了产品所具有的业务方法。
  • ConcreteProduct(具体产品):它定义具体工厂生产的具体产品对象,实现抽象产品接口中声明的业务方法。

img

产品族和等级结构示意图

  1. 产品等级结构:产品等级结构即产品的继承结构(三种品牌汽车构成了三个不同的产品等级结构)
  2. 产品族:在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品。比如(suv工厂里生产的三个品牌车型)
怎么用

第三年:audi,benz,bmw告诉厂长,我们这次的订单需要分成suv,business,sport三种类型的车。这时候管理蛮不过来了。所以厂子又请了两个管理。分别管理三个品牌的车子。

//  抽象工厂两种情况同工厂方法上
//  method 1
    SUVFactory *suvf = [[SUVFactory alloc] init];
    [suvf createAudiCar];
    
//  method 2
    AbstractFactorys *af = [[SportsFactorys alloc] init];
    [af CreateAudiFactoy];
#import <Foundation/Foundation.h>

@interface AbstractFactorys : NSObject
//抽象工厂(三个管理者)
-(void)CreateBenzFactoy;
-(void)CreateBMWFactoy;
-(void)CreateAudiFactoy;
@end
#import "SUVFactory.h"
//具体工厂
@implementation SUVFactory
-(void)createBenzCar{
    NSLog(@"抽象工厂方法生产了benzSUV");
}
-(void)createBWMCar{
    NSLog(@"抽象工厂方法生产了BWMSUV");
}
-(void)createAudiCar{
    NSLog(@"抽象工厂方法生产了AudiSUV");
}
@end
为什么

抽象工厂模式与工厂方法模式最大的区别在于,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式需要面对多个产品等级结构,一个工厂等级结构可以负责多个不同产品等级结构中的产品对象的创建。当一个工厂等级结构可以创建出分属于不同产品等级结构的一个产品族中的所有对象时,抽象工厂模式比工厂方法模式更为简单、更有效率,如使用工厂方法模式,上图所示结构需要提供15个具体工厂,而使用抽象工厂模式只需要提供3个具体工厂。

当增加新的产品族的时候,符合“开闭原则”,只需让产品继承相应的抽象产品,对象的工厂继承抽象工厂即可,而无需修改其他的代码。

当增加产品等级结构的时候,不符合“开闭原则”,如新添加大众,那么在soprt,suv,business三个具体工厂里面都进行修改。当然我们可以配合反射机制来对抽象工厂进行优化。

//根据字符串来创建类
    NSClassFromString(<#NSString * _Nonnull aClassName#>)```
----

###总结

简单工厂启示是工厂方法的一种极端实现,工厂方法是抽象方法的一种极端实现。在实际项目中,如果不是项目过大或者功能过于复杂,抽象工厂设计模式一般使用不到。简单工厂模式反而是用的比较频繁。但是这种思想我们还是需要借鉴的。在CoCoa Touch框架中的'类簇'便是基于抽象工厂模式设计。NSNumber就是最好的例子。
NSNumber *boolNumber = [NSNumber numberWithBool:YES];
NSLog(@"%@",[[boolNumber class] description]);

// 输出 __NSCFBoolean
NSLog(@"%d",[boolNumber boolValue]);
//输出1
NSNumber(抽象工厂)->NSCFBoolean(具体工厂子类)-> 重载boolValue工厂方法 ->返回实际产品

这种设计多类型的对象的创建。好的模式应该是变成一种抽象,不暴露创建过程中任何不必要的细节和创建对象的具体类型。



ps:最后厂长去打lol了

都看到最后了还不给个喜欢么……

[demo](https://github.com/Xmanzn/Design-Patterns)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值