设计模式一(工厂模式)

2019-12-10  本文已影响0人  二猪哥

工厂模式可以简单概括为同类型不同型号的产品有各自对应的工厂进行生产。
比如iPhone手机旗下有iPhoneX及iPhone8两种型号的手机,iPhoneX有自己iPhoneX的专属工厂进行生产,而iPhone8有自己iPhone8的专属工厂进行生产。两条生产线没有交集互不影响,后期如果新增或废弃相关类型的产品也不会影响到原有的生产线。

三种模式

一、简单工厂模式

1、简单工厂模式定义

​ 简单工厂模式(Simple Factory Pattern):定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。因为在简单工厂模式中用于创建实例的方法是静态(static)方法,因此简单工厂模式又被称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。

​ 注意:简单工厂模式并不属于GoF 23个经典设计模式,但通常将它作为学习其他工厂模式的基础。

简单工厂模式的要点:当你需要什么,只需要传入一个正确的参数,就可以获取你所需要的对象,而无须知道其创建细节。

2、简单工厂模式包含的角色

​ 简单工厂模式的要点:当你需要什么,只需要传入一个正确的参数,就可以获取你所需要的对象,而无须知道其创建细节。

3、结构图 简单工厂模式

父类Fruits具有一个属性name和一个方法sweet、poorTaste,AppleFruit和OrangeFruit继承自Fruits,简单工厂类为FruitFactory,负责根据传入的不同参数FruitType来决定生产的是AppleFruit还是OrangeFruit。

4、示例

本Demo还是以小贩卖苹果和橘子为例:(小贩就是一个工厂,他为你提供苹果,橘子等水果)

具体代码如下:
Fruits类:

#import <Foundation/Foundation.h>  //Fruits.h

@interface Fruits : NSObject
/**水果名*/
@property (nonatomic,copy) NSString *name;
- (void)sweet; /**< 甜 */
- (void)poorTaste; /**< 不好吃 */
@end


#import "Fruits.h"     //Fruits.m

@implementation Fruits
// 甜
- (void)sweet {}

// 不好吃
- (void)poorTaste {}
@end

AppleFruit和OrangeFruit类

/*------------------AppleFruit------------------*/
#import "Fruits.h"    //AppleFruit.h

//遵循了开闭原则
@interface AppleFruit : Fruits
- (void)freshApple; /**< 新鲜的苹果 */   // 开闭原则
@end



#import "AppleFruit.h"       //AppleFruit.m

@implementation AppleFruit
@synthesize name;
// 甜
- (void)sweet {
    NSLog(@"%@非常甜的啦-----%s",self.name, __func__);
}

// 不好吃
- (void)poorTaste {
    NSLog(@"%@不好吃的啦-----%s",self.name,__func__);
}

// 新鲜的苹果
- (void)freshApple {
     NSLog(@"%@是新鲜的-----%s",self.name,__func__);
}
@end


/*------------------OrangeFruit------------------*/
#import "Fruits.h"                       //OrangeFruit.h

@interface OrangeFruit : Fruits

- (void)acidOrange; /**< 酸橘子 */
@end



#import "OrangeFruit.h"           //OrangeFruit.m

@implementation OrangeFruit
@synthesize name;
// 甜
- (void)sweet {
   NSLog(@"%@非常甜的啦-----%s",self.name, __func__);
}

// 不好吃
- (void)poorTaste {
    NSLog(@"%@不好的啦-----%s",self.name, __func__);
}

/**< 酸橘子 */
- (void)acidOrange {
    NSLog(@"%@有点酸-----%s",self.name, __func__);
}
@end

FruitFactory类:

#import <Foundation/Foundation.h>             //FruitFactory.h
#import "Fruits.h"
#import "AppleFruit.h"
#import "OrangeFruit.h"

typedef NS_ENUM(NSInteger,FruitType){
    FruitTypeApple,
    FruitTypeOrange,
};

@interface FruitFactory : NSObject
// 创造水果的工厂
+ (Fruits *)fruitsFactory:(FruitType)type;
@end



#import "FruitFactory.h"                         //FruitFactory.m
@implementation FruitFactory
+ (Fruits *)fruitsFactory:(FruitType)type {
    // 创建空的对象.在工厂方法里面进行水果的制造
    Fruits *fruits = nil;

    switch (type) {
        case FruitTypeApple:
            fruits = [[AppleFruit alloc] init];
            break;

        case FruitTypeOrange:
            fruits = [[OrangeFruit alloc] init];
            break;

        default:
            break;
    }
    return fruits;
}
@end

运行代码:

#import "ViewController.h"
#import "FruitFactory.h"
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
   
/*###############SimpleFactoryPattern(简单工厂模式)######################*/
    // 在水果工厂里面创建出苹果
    Fruits *fruit =  [FruitFactory fruitsFactory:FruitTypeApple];
    fruit.name = @"苹果";
    [fruit sweet];
    
    // 在水果工厂里面创建出苹果
    Fruits *fruit1 =  [FruitFactory fruitsFactory:FruitTypeOrange];
    fruit1.name = @"橘子";
    [fruit1 poorTaste];
    
    // 在水果工厂里面创建出苹果, 调用私有的方法
    AppleFruit *apple =  (AppleFruit*)[FruitFactory fruitsFactory:FruitTypeApple];
    apple.name = @"苹果";
    [apple freshApple];
    
    // 在水果工厂里面创建出橘子, 调用私有的方法
    OrangeFruit *orage =  (OrangeFruit *)[FruitFactory fruitsFactory:FruitTypeOrange];
    orage.name = @"橘子";
    [orage acidOrange];
}
@end

打印结果:

2019-12-10 16:07:55.643264+0800 设计模式[78854:2676436] 苹果非常甜的啦------[AppleFruit sweet]
2019-12-10 16:07:55.643415+0800 设计模式[78854:2676436] 橘子不好的啦------[OrangeFruit poorTaste]
2019-12-10 16:07:55.643524+0800 设计模式[78854:2676436] 苹果是新鲜的------[AppleFruit freshApple]
2019-12-10 16:07:55.643629+0800 设计模式[78854:2676436] 橘子有点酸------[OrangeFruit acidOrange]
5、总结

简单工厂模式的简化:有时候,为了简化简单工厂模式,我们可以将抽象产品类和工厂类合并,将静态工厂方法移至抽象产品类中。比如在Fruits类中添加一个方法:

Fruits类:

#import <Foundation/Foundation.h>

typedef NS_ENUM(NSInteger,FruitType){
    FruitTypeApple,
    FruitTypeOrange,
};

@interface Fruits : NSObject
/**水果名*/
@property (nonatomic,copy) NSString *name;
- (void)sweet; /**< 甜 */
- (void)poorTaste; /**< 不好吃 */

// 创造水果的工厂
+ (Fruits *)fruitsFactory:(FruitType)type;
@end


#import "Fruits.h"
#import "AppleFruit.h"
#import "OrangeFruit.h"
@implementation Fruits
// 甜
- (void)sweet {}

// 不好吃
- (void)poorTaste {}

+ (Fruits *)fruitsFactory:(FruitType)type {
    // 创建空的对象.在工厂方法里面进行水果的制造
    Fruits *fruits = nil;

    switch (type) {
        case FruitTypeApple:
            fruits = [[AppleFruit alloc]init];
            break;

        case FruitTypeOrange:
            fruits = [[OrangeFruit alloc]init];
            break;

        default:
            break;
    }
    return fruits;
}
@end

运行代码:

Fruits *fruit =  [Fruits fruitsFactory:FruitTypeApple];
fruit.name = @"苹果";
[fruit sweet];
    
AppleFruit *apple =  (AppleFruit*)[Fruits fruitsFactory:FruitTypeApple];
apple.name = @"苹果";
[apple freshApple];

​ 简单工厂模式提供了专门的工厂类用于创建对象,将对象的创建和对象的使用分离开,它作为一种最简单的工厂模式在软件开发中得到了较为广泛的应用。

1)优点
2)缺点
3)适用场景

暂时先写到这,后续有时间再更新...

上一篇 下一篇

猜你喜欢

热点阅读