美文网首页
抽象工厂(Abstract Factory)

抽象工厂(Abstract Factory)

作者: long弟弟 | 来源:发表于2022-09-10 00:37 被阅读0次

抽象工厂

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

工厂方法只能生产一个产品(单个产品)
抽象工厂可以一下生产一个产品族(里面有很多产品组成)

抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的。抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品族的产品对象。

抽象工厂.jpg

角色和职责

  1. 抽象工厂(Abstract Factory)
    抽象工厂模式的核心,包含对多个产品结构的声明,任何工厂类都必须实现这个接口。
  2. 具体工厂(Concrete Factory)
    具体工厂类是抽象工厂的一个实现,负责实例化某个产品族中的产品对象
  3. 抽象(AbstractProduct)
    抽象模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
  4. 具体产品(ConCreteProduct)
    抽象模式所创建的具体实例对象。

代码示例

#import <Foundation/Foundation.h>
//抽象产品A
@interface AbstractProductA : NSObject
- (void)anOperation;
@end
@implementation AbstractProductA
@end
//抽象产品B
@interface AbstractProductB : NSObject
- (void)anOperation;
@end
@implementation AbstractProductB
@end
//产品A
@interface AProduct : AbstractProductA
@end
@implementation AProduct
- (void)anOperation {
    NSLog(@"A Product");
}
@end
//产品AA
@interface AAProduct : AbstractProductA
@end
@implementation AAProduct
- (void)anOperation {
    NSLog(@"AA Product");
}
@end
//产品B
@interface BProduct : AbstractProductB
@end
@implementation BProduct
- (void)anOperation {
    NSLog(@"B Product");
}
@end
//产品BB
@interface BBProduct : AbstractProductB
@end
@implementation BBProduct
- (void)anOperation {
    NSLog(@"BB Product");
}
@end
//抽象工厂
@interface AbstractFactory : NSObject
- (AbstractProductA *)createProduct1;
- (AbstractProductB *)createProduct2;
@end
@implementation AbstractFactory
@end
//A工厂
@interface AFactory : AbstractFactory
@end
@implementation AFactory
- (AbstractProductA *)createProduct1 {
    return [[AProduct alloc] init];
}
- (AbstractProductA *)createProduct2 {
    return [[AAProduct alloc] init];
}
@end
//B工厂
@interface BFactory : AbstractFactory
@end
@implementation BFactory
- (AbstractProductB *)createProduct1 {
    return [[BProduct alloc] init];
}
- (AbstractProductB *)createProduct2 {
    return [[BBProduct alloc] init];
}
@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        AbstractFactory *af = nil;
        af = [[AFactory alloc] init];
        [[af createProduct1] anOperation];
        [[af createProduct2] anOperation];
        NSLog(@"生产:A、AA");
        af = [[BFactory alloc] init];
        [[af createProduct1] anOperation];
        [[af createProduct2] anOperation];
        NSLog(@"生产:B、BB");
    }
    return 0;
}
//输出
/*
A Product
AA Product
生产:A、AA
B Product
BB Product
生产:B、BB
*/

优点

可以一下生产一个产品族。一个工厂负责创建多个不同类型的产品。

缺点

以代码为例,抽象工厂类目前只能生产createProduct1和createProduct2,生产更多的产品的话需要修改该抽象工厂类及具体工厂类!产品线是写死的!

相关文章

网友评论

      本文标题:抽象工厂(Abstract Factory)

      本文链接:https://www.haomeiwen.com/subject/qlzznrtx.html