简单工厂模式的结构和运用

因为设计模式学习中须要配合UML图,因此先学习下UML的经常使用方法git

UML结构类图的经常使用画法github

Demo传送门编程

案例:有苹果,华为,三星三种电子产品供外界使用设计模式

普通模式的解决方法

这里咱们采用面向协议编程的方式,也能够用继承方式,这里推荐面向协议post

1.首先是定义一个协议,并规定协议的方法

协议

协议里面先规定了一个方法- (void)createProduct;,上面的枚举先不看,后面使用简单工厂的时候会用到学习

2.建立三种产品,并遵循协议,实现协议的方法

这里只贴出一种,其他两种处理方式同样优化

.h文件

.m文件

3.客户端引用以下:

客户端引用

鉴于普通方法下的劣势很容易就能看到,客户不但知道了接口,并且也知道了具体有谁去实现,接口的思想是"封装隔离",实现类应该是被接口隔离开的,也就是咱们最好只知道 id<ProductProtocol> 可是不知道具体是谁 [[IPhoneProduct alloc] init] 显然咱们是知道具体产品的设计

那么若是想要在不知道具体产品的状况下就能实现接口,该如何实现呢?下面简单讲述一下简单工厂的设计理念code

简单工厂的设计

1.认识简单工厂

在开始用简单工厂实现上述案例以前,先来认识一下什么叫简单工厂cdn

1.简单工厂的定义:

提供一个建立对象实例的功能,而无需关心其具体实现。被建立实例的类型可使接口,抽象类或者具体的类。

简而言之,外界不知道一个工厂里面到底要生成什么样的实例对象,只须要传入一个标识,工厂内部本身就能生产对应的产品,工厂内部是知道具体产品的实现的,最后只须要返回给客户端一个遵循协议的对象便可,客户端拿到这个对象就能直接访问接口协议方法,而不须要关心具体的实现。

下面以一个UML结构图简单展现下简单工厂的结构图:

UML结构类图

下面说明一下各个角色的功能和做用

  • Client:客户端,经过工厂获取遵循协议的对象,以后就是面向协议编程
  • ProductFactory:简单工厂,经过客户端传入的标识去建立遵循协议的接口对象
  • ProductProtocol:定制客户所须要的功能接口,也就是协议
  • IPhoneProduct,HuaWeiProduct,SanXingProduct:具体的实现类,实现协议规定的接口

2.代码实现简单工厂

接口协议定制

接口定制

具体实现类

实现类.h

实现类.m

HuaWeiProduct,SanXingProduct相似

工厂类:

工厂类.h

工厂类.m

客户端实现:

简单工厂客户端

经过上述代码能够看出,客户端是不知道接口的具体实现的,和具体实现类接触的类变成了工厂类,咱们能够这么理解,工厂类,接口类和具体实现类做为一个封装体,暴露给外界的只是工厂类的一个类方法和接口类

后续若是须要再加另外的具体实现类,只须要新增实现类并在工厂类新增一个判断条件便可

优化方案:为了不修改工厂类,还可使用配置文件,在配置文件中配置好实现类相关的信息,实现类中须要有type,name(类名)等信息,下面我具体来实现如下:

配置文件

工厂类解析配置文件

大体实现思路就是这样,总的归纳来讲,简单工厂的本质就是选择性地去建立具体产品(实现类),工厂里面主要就是选择性建立,而实现的难点在于如何选择性建立,我这里着重讲述的是从客户端传递参数的方式。对于什么时候选用简单工厂,能够从如下两个方面考虑:

  • 想要彻底封装隔离具体实现,外部只能经过接口操做封装体
  • 想要把对外建立的职责几种管理和控制

3.简单工厂的优缺点

优势

  • 具备封装性,很好地实现了组件的封装,组件外部实现了面向接口编程
  • 解耦性,实现了客户端和具体实现类的解耦合

缺点

  • 可能会增长客户端的复杂度,由于客户端须要向工厂传递参数,就必得理解所传参数的含义
  • 不方便扩展子工厂
相关文章
相关标签/搜索