美文网首页
工厂方法模式-(设计模式1)

工厂方法模式-(设计模式1)

作者: 不是长颈鹿 | 来源:发表于2017-07-13 16:52 被阅读7次

什么是工厂方法模式?

要了解工厂方法模式先要了解其中的四种角色:

工厂抽象类G:抽象类,主要是定义生产产品类的接口。

工厂子类g:继承工厂抽象类,实现工厂抽象类的接口,实例化相对应的产品子类。

产品抽象类C:定义产品的基本属性和方法。

产品子类:具体的产品类,工厂子类实例化的对象。

官方解释工厂方法模式:定义一个用于创建对象的接口(工厂抽象类),让子类(工厂子类)决定实例化哪些类(产品子类),使一个类(产品子类)的实例化延迟到子类(工厂子类)。

我的解释:创建G(工厂抽象类),g(工厂子类),C(产品抽象类),c(产品子类)四个类,G定义一个生产产品的接口如createProduct,g继承G,g实现createProduct,创建c并将c返回,c继承C。这样项目如果要修改c时只需要修改g中createProduct方法中实例化的对象。

工厂方法模式的优缺点:

优点:

1.将实例化产品类全部归到一个接口,当要换产品类时,只需要修改接口中实例化的类就行了,而项目中的其他地方不用变换。

2.删除和增加是变得容易,符合开放封闭原则

缺点:

1.如要要增加产品类时,也要对应的增加工厂类。

工厂方法模式的代码实现:

1.创建一个形状基类PFAbstractShape。该类中定义了形状的基本行为和属性,如下代码所示:

PFAbstractShape.h

#import <Foundation/Foundation.h>

#define PF_Exception_Format @"在%@的子类中必须override:%@方法"

@interfacePFAbstractShape :NSObject

@property(nonatomic,weak)NSString*name;

//子类必须重写这个draw方法,否则会抛出异常错误

-(void)draw;

@end

PFAbstractShape.m

#import"PFAbstractShape.h"

@implementationPFAbstractShape

-(void)draw

{

//如果是通过PFAbstractShape的实例调用此处的draw,则绘制一个PFAbstractShape图形

if([selfisMemberOfClass:[PFAbstractShapeclass]]) {

NSLog(@"绘制一个PFAbstractShape图形");

}else{

//如果是通过PFAbstractShape子类的实例调用了此处的draw,则抛出一个异常:表明子类并没有重写draw方法。

//注:在OC中并没有abstract class的概念,只有protocol,如果在基类中只定义接口(没有具体方法的实现),

//则可以使用protocol,这样会更方便。

[NSExceptionraise:NSInternalInconsistencyException

format:PF_Exception_Format, [NSStringstringWithUTF8String:object_getClassName(self)],NSStringFromSelector(_cmd)];

}

}

在上面的代码中定义了一个draw方法,为了让子类必须实现该方法,在PFAbstractShape中做了特殊处理,具体内容可以看上面的代码,已经有注视了。

2.子类化形状基类。首先子类化一个圆形类:PFCircleShape。

PFCircleShape.h

#import"PFAbstractShape.h"

@interfacePFCircleShape :PFAbstractShape

@end

PFCircleShape.m

#import"PFCircleShape.h"

@implementationPFCircleShape

- (void)draw

{

NSLog(@"绘制一个PFCircleShape图形");

}

@end

在上面的子类中,重写了基类的draw方法。同样,我们再子类化一个正方形类,并重写draw方法,如下代码所示:

PFSquareShape.h

#import"PFAbstractShape.h"

@interfacePFSquareShape :PFAbstractShape

@end

PFSquareShape.m

#import"PFSquareShape.h"

@implementationPFSquareShape

- (void)draw

{

NSLog(@"绘制一个PFSquareShape图形");

}

@end

3.创建一个工厂方法的基类PFAbstractFactory

PFAbstractFactory.h

#import<Foundation/Foundation.h>

#import"PFAbstractShape.h"

@interfacePFAbstractFactory :NSObject

- (PFAbstractShape*)factoryMethod;

@end

PFAbstractFactory.m

#import"PFAbstractFactory.h"

@implementationPFAbstractFactory

-(PFAbstractShape*)factoryMethod

{

//在此处,子类必须重写factoryMethod方法。当然,在工厂模式中,也可以在此处返回一个默认的Product。

//如果是通过PFAbstractFactory子类的实例调用了此处的factoryMethod,则抛出一个异常:表明子类并没有重写factoryMethod方法。

[NSExceptionraise:NSInternalInconsistencyException

format:PF_Exception_Format, [NSStringstringWithUTF8String:object_getClassName(self)],NSStringFromSelector(_cmd)];

//下面这个return语句只是为了消除警告,实际上永远都不会执行到这里。

returnnil;

}

@end

在上面的代码中,定义了一个factoryMethod,该类的子类必须实现该方法,通过实现该方法,返回一个具体的形状对象。下面来看看该类的子类化。

4.子类化工厂方法的基类。首先子类化一个圆形工厂方法PFCircleShapeFactory:

PFCircleShapeFactory.h

#import"PFAbstractFactory.h"

#import"PFCircleShape.h"

@interfacePFCircleShapeFactory :PFAbstractFactory

@end

PFCircleShapeFactory.m

#import"PFCircleShapeFactory.h"

@implementationPFCircleShapeFactory

- (PFAbstractShape*)factoryMethod

{

return[[PFCircleShapealloc]init];

}

@end

如上代码所示,重写了factoryMethod,返回一个PFCircleShape实例。下面来看看另外一个子类PFSquareShapeFactory

PFSquareShapeFactory.h

#import"PFAbstractFactory.h"

#import"PFSquareShape.h"

@interfacePFSquareShapeFactory :PFAbstractFactory

@end

PFSquareShapeFactory.m

#import"PFSquareShapeFactory.h"

@implementationPFSquareShapeFactory

- (PFAbstractShape*)factoryMethod{

return[[PFSquareShapealloc]init];

}

@end

该子类返回的是一个PFSquareShape实例。

5.工厂方法的使用。定义一个PFClient类,在该类中演示工厂方法的使用。代码如下:

PFClient.h

#import

@interfacePFClient :NSObject

- (void)doSomething;

@end

PFClient.m

#import"PFClient.h"

#import"PFAbstractFactory.h"

#import"PFCircleShapeFactory.h"

#import"PFSquareShapeFactory.h"

#import"PFAbstractShape.h"

#import"PFCircleShape.h"

#import"PFSquareShape.h"

@implementationPFClient

-(void)doSomething

{

//用到多态,父指针指向子对象,当要修改实例化的对象时,只需要修改工厂里的实例化对象

//工厂方法的实例化

PFAbstractFactory*circleShapefactory = [[PFCircleShapeFactoryalloc]init];

PFAbstractFactory*squareShapefactory = [[PFSquareShapeFactoryalloc]init];

//通过工厂方法实例化对应的形状

PFAbstractShape*circleShape = [circleShapefactoryfactoryMethod];

PFAbstractShape*squareShape = [squareShapefactoryfactoryMethod];

//调用形状的方法

[circleShapedraw];

[squareShapedraw];

}

@end

如上代码所示,首先实例化两个工厂方法,并通过工厂方法创建出对应的形状,最后调用形状的draw方法进行测试。会在控制台窗口输出如下内容:

2013-05-16 10:12:46.292 FactoryMethodPattern[2845:c07] 绘制一个PFCircleShape图形

2013-05-16 10:12:46.295 FactoryMethodPattern[2845:c07] 绘制一个PFSquareShape图形

相关文章

  • 设计模式-工厂模式

    设计模式1 设计模式2 工厂模式 工厂模式可简单的分为三类:简单工厂,工厂方法,抽象工厂 简单工厂模式 定义 简单...

  • 设计模式、第一篇

    常用设计模式 设计模式分类 1.创建型 工厂方法模式(Factory Method)、抽象工厂模式(Abstrac...

  • 【重温设计模式】工厂设计模式

    一.介绍 工厂设计模式的分类 1.简单工厂模式2.工厂方法模式3.抽象工厂模式 工厂设计模式在工作中的应用 1.s...

  • 三、创建型模型

    简单工厂模式 工厂方法模式 抽象工厂模式 单例模式 1.简单工厂模式 简单工厂模式并不属于23种设计模式。 不难看...

  • 设计模式[2]-工厂方法模式-Factory Method Pa

    1. 工厂方法模式简介 工厂方法模式(Factory Method Pattern)是创建型的设计模式,和简单工厂...

  • 设计模式-工厂方法模式

    1 工厂方法模式介绍 工厂方法模式(Factory Pattern)是创建型设计模式之一。工厂方法模式是一种结构简...

  • 设计模式的基本概念与区别

    1、设计模式有哪些? 23种设计模式总体分为三大类创建型设计模式,共5种简单工厂、工厂方法模式,抽象工厂模式,单例...

  • 设计模式之工厂模式

    设计模式之工厂模式 1. 简单工厂模式 1.1 模式定义 简单工厂模式又称为静态工厂方法,它属于创建型模式。在简单...

  • 2021-11-16 - 学习记录

    设计模式学习:创建型:工厂(工厂方法,抽象工厂),建造者,单例,原型 设计模式:工厂模式 简单工厂 工厂方法 抽象工厂

  • 工厂模式

    工厂模式 就是工厂---生产-->产品 在设计模式中,分为 简单工厂模式, 工厂方法模式,抽象工厂模式. 工厂模式...

网友评论

      本文标题:工厂方法模式-(设计模式1)

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