如上图所示,外面红色大框是抽象工厂,里面小框是工厂。
工厂
工厂:我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
工厂代码演示:
---------------XiaoMiPhone---------------
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface XiaoMiPhone : NSObject
- (void)create;
@end
NS_ASSUME_NONNULL_END
#import "XiaoMiPhone.h"
@implementation XiaoMiPhone
- (void)create {
NSLog(@"create-XiaoMiPhone");
}
@end
---------------RedMiPhone---------------
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface RedMiPhone : NSObject
- (void)create;
@end
NS_ASSUME_NONNULL_END
#import "RedMiPhone.h"
@implementation RedMiPhone
- (void)create {
NSLog(@"create-RedMiPhone");
}
@end
#import <Foundation/Foundation.h>
typedef NS_ENUM(NSInteger,PhoneFactoryType) {
PhoneTypeXiaoMi = 0,
PhoneTypeRedMi,
};
---------------XiaoMiPhoneFactory----------------
NS_ASSUME_NONNULL_BEGIN
@interface XiaoMiPhoneFactory : NSObject
+ (id)createPhone:(PhoneFactoryType)type;
@end
NS_ASSUME_NONNULL_END
#import "XiaoMiPhoneFactory.h"
#import "XiaoMiPhone.h"
#import "RedMiPhone.h"
@implementation XiaoMiPhoneFactory
+ (id)createPhone:(PhoneFactoryType)type {
switch (type) {
case PhoneTypeXiaoMi:
{
return [XiaoMiPhone new];
}
break;
case PhoneTypeRedMi:
{
return [RedMiPhone new];
}
break;
default:
break;
}
}
@end
使用:
XiaoMiPhone *xPhone = [XiaoMiPhoneFactory createPhone:PhoneTypeXiaoMi];
RedMiPhone *rPhone = [XiaoMiPhoneFactory createPhone:PhoneTypeRedMi];
[xPhone create];
[rPhone create];
抽象工厂
抽象工厂:是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
工厂代码演示:
---------------XiaoMiTvFactory---------------
#import <Foundation/Foundation.h>
typedef NS_ENUM(NSInteger,TvFactoryType) {
TvType4A = 0,
TvType5A,
};
NS_ASSUME_NONNULL_BEGIN
@interface XiaoMiTvFactory : NSObject
+ (id)createPhone:(TvFactoryType)type;
@end
NS_ASSUME_NONNULL_END
#import "XiaoMiTvFactory.h"
#import "XiaoMi4ATv.h"
#import "XiaoMi5ATv.h"
@implementation XiaoMiTvFactory
+ (id)createPhone:(TvFactoryType)type {
switch (type) {
case TvType4A:
{
return [XiaoMi4ATv new];
}
break;
case TvType5A:
{
return [XiaoMi5ATv new];
}
break;
default:
break;
}
}
@end
---------------XiaoMi5ATv---------------
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface XiaoMi5ATv : NSObject
- (void)create;
@end
NS_ASSUME_NONNULL_END
#import "XiaoMi5ATv.h"
@implementation XiaoMi5ATv
- (void)create {
NSLog(@"create-XiaoMi5ATv");
}
@end
---------------XiaoMi4ATv---------------
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface XiaoMi4ATv : NSObject
- (void)create;
@end
NS_ASSUME_NONNULL_END
#import "XiaoMi4ATv.h"
@implementation XiaoMi4ATv
- (void)create {
NSLog(@"create-XiaoMi4ATv");
}
@end
---------------XiaoMiFactory---------------
#import <Foundation/Foundation.h>
typedef NS_ENUM(NSInteger,XiaoMiFactoryType) {
XiaoMiTypePhone = 0,
XiaoMiTypeTv,
};
NS_ASSUME_NONNULL_BEGIN
@interface XiaoMiFactory : NSObject
+ (Class)createFactory:(XiaoMiFactoryType)type;
@end
NS_ASSUME_NONNULL_END
#import "XiaoMiFactory.h"
#import "XiaoMiPhoneFactory.h"
#import "XiaoMiTvFactory.h"
@implementation XiaoMiFactory
+ (Class)createFactory:(XiaoMiFactoryType)type {
switch (type) {
case XiaoMiTypePhone:
{
return [XiaoMiPhoneFactory class];
}
break;
case XiaoMiTypeTv:
{
return [XiaoMiTvFactory class];
}
break;
default:
break;
};
}
网友评论