设计模式之工厂方法模式

简介:

前面学习了简单工厂 ,用了生产汽车的例子,上个例子是一个工厂生产BMW、Benz两种车,如果以后还需要生产Lambo、红旗等,按照简单工厂那就需要改工厂类的代码,这样扩展性不好,工厂方法能解决这个问题。

百度百科上写的还挺具体:

定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。

工厂方法模式是简单工厂模式的衍生,解决了许多简单工厂模式的问题。首先完全实现‘开-闭 原则’,实现了可扩展。其次更复杂的层次结构,可以应用于产品结果复杂的场合。

工厂方法模式对简单工厂模式进行了抽象。有一个抽象的Factory类(可以是抽象类和接口),这个类将不再负责具体的产品生产,而是只制定一些规范,具体的生产工作由其子类去完成。在这个模式中,工厂类和产品类往往可以依次对应。即一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品,这个具体的工厂就负责生产对应的产品。
工厂方法模式(Factory Method pattern)是最典型的 模板方法模式(Template Method pattern)应用。
 
UML图:
抽象工厂(Creator)角色:是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。
具体工厂(Concrete Creator)角色:这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。在上图中有两个这样的角色:BulbCreator与TubeCreator。
抽象产品(Product)角色:工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。在上图中,这个角色是Light。
具体产品(Concrete Product)角色:这个角色实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应。
代码实现:
1.抽象工厂

#import <Foundation/Foundation.h>
#import "ILight.h"
@protocol ICreator <NSObject>
-(id<ILight>) createLight;
@end

2.具体工厂

1、BulbCreator工厂生产BulbLight


#import <Foundation/Foundation.h>
#import "ICreator.h"
@interface BulbCreator : NSObject<ICreator>
@end


#import "BulbCreator.h"
#import "ILight.h"
#import "BulbLight.h"

@implementation BulbCreator
-(id<ILight>) createLight
{
    return [[BulbLight alloc]init];
}
@end

2、TubeCreator生产TubeLight

#import <Foundation/Foundation.h>
#import "ICreator.h"
@interface TubeCreator : NSObject<ICreator>
@end


#import "TubeCreator.h"
#import "TubeLight.h"

@implementation TubeCreator
-(id<ILight>) createLight
{
    return [[TubeLight alloc]init];
}
@end

3.抽象产品

#import <Foundation/Foundation.h>

@protocol ILight <NSObject>
-(void)turnOn;
-(void)turnOff;
@end

4.具体产品

1、BulbLight


#import <Foundation/Foundation.h>
#import "ILight.h"
@interface BulbLight : NSObject<ILight>
@end


#import "BulbLight.h"
@implementation BulbLight
-(void)turnOn
{
    NSLog(@"BulbLight turnOn");
}
-(void)turnOff
{
    NSLog(@"BulbLight turnOff");
}
@end

2、TubeLight

#import <Foundation/Foundation.h>
#import "ILight.h"
@interface TubeLight : NSObject<ILight>

@end


#import "TubeLight.h"
@implementation TubeLight
-(void)turnOn
{
    NSLog(@"TubeLight turnOn");
}
-(void)turnOff
{
    NSLog(@"TubeLight turnOff");
}
@end

5.调用
 id<ICreator>  bulbCreatorFactory=[[BulbCreator alloc]init];
    [[bulbCreatorFactory createLight] turnOn];
    
    id<ICreator> tubeCreatorFactory=[[TubeCreator alloc]init];
    [[tubeCreatorFactory createLight] turnOff];



相关文章
|
10天前
|
设计模式 SQL 算法
设计模式了解哪些,模版模式
设计模式了解哪些,模版模式
19 0
|
30天前
|
设计模式 Java uml
C++设计模式之 依赖注入模式探索
C++设计模式之 依赖注入模式探索
37 0
|
3月前
|
设计模式 存储 算法
Java 设计模式最佳实践:三、行为模式
Java 设计模式最佳实践:三、行为模式
|
3月前
|
设计模式 Go 开发工具
Golang设计模式——12中介模式
Golang设计模式——12中介模式
25 0
|
2月前
|
设计模式 前端开发 JavaScript
观察者模式 vs 发布-订阅模式:两种设计模式的对决!
欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣、刚刚开始学习前端的读者们打造的。无论你是初学者还是有一些基础的开发者,我们都会在这里为你提供一个系统而又亲切的学习平台。我们以问答形式更新,为大家呈现精选的前端知识点和最佳实践。通过深入浅出的解释概念,并提供实际案例和练习,让你逐步建立起一个扎实的基础。无论是HTML、CSS、JavaScript还是最新的前端框架和工具,我们都将为你提供丰富的内容和实用技巧,帮助你更好地理解并运用前端开发中的各种技术。
|
7天前
|
设计模式 Java 数据库
小谈设计模式(2)—简单工厂模式
小谈设计模式(2)—简单工厂模式
|
7天前
|
设计模式 Java
小谈设计模式(9)—工厂方法模式
小谈设计模式(9)—工厂方法模式
|
1月前
|
设计模式 编译器
解析器模式--设计模式
解析器模式--设计模式
17 0
|
1月前
|
设计模式 算法
构建器模式--设计模式
构建器模式--设计模式
17 0
|
1月前
|
设计模式
【设计模式】中介模式
【设计模式】中介模式