因为设计模式学习中须要配合UML图,因此先学习下UML的经常使用方法git
UML结构类图的经常使用画法github
Demo传送门编程
案例:有苹果,华为,三星三种电子产品供外界使用设计模式
这里咱们采用面向协议编程的方式,也能够用继承方式,这里推荐面向协议post
协议里面先规定了一个方法- (void)createProduct;
,上面的枚举先不看,后面使用简单工厂的时候会用到学习
这里只贴出一种,其他两种处理方式同样优化
鉴于普通方法下的劣势很容易就能看到,客户不但知道了接口,并且也知道了具体有谁去实现,接口的思想是"封装隔离",实现类应该是被接口隔离开的,也就是咱们最好只知道 id<ProductProtocol>
可是不知道具体是谁 [[IPhoneProduct alloc] init]
显然咱们是知道具体产品的设计
那么若是想要在不知道具体产品的状况下就能实现接口,该如何实现呢?下面简单讲述一下简单工厂的设计理念code
在开始用简单工厂实现上述案例以前,先来认识一下什么叫简单工厂cdn
1.简单工厂的定义:
提供一个建立对象实例的功能,而无需关心其具体实现。被建立实例的类型可使接口,抽象类或者具体的类。
简而言之,外界不知道一个工厂里面到底要生成什么样的实例对象,只须要传入一个标识,工厂内部本身就能生产对应的产品,工厂内部是知道具体产品的实现的,最后只须要返回给客户端一个遵循协议的对象便可,客户端拿到这个对象就能直接访问接口协议方法,而不须要关心具体的实现。
下面以一个UML结构图简单展现下简单工厂的结构图:
下面说明一下各个角色的功能和做用
接口协议定制
具体实现类
HuaWeiProduct,SanXingProduct相似
工厂类:
客户端实现:
经过上述代码能够看出,客户端是不知道接口的具体实现的,和具体实现类接触的类变成了工厂类,咱们能够这么理解,工厂类,接口类和具体实现类做为一个封装体,暴露给外界的只是工厂类的一个类方法和接口类
后续若是须要再加另外的具体实现类,只须要新增实现类并在工厂类新增一个判断条件便可
优化方案:为了不修改工厂类,还可使用配置文件,在配置文件中配置好实现类相关的信息,实现类中须要有type,name(类名)等信息,下面我具体来实现如下:
大体实现思路就是这样,总的归纳来讲,简单工厂的本质就是选择性地去建立具体产品(实现类),工厂里面主要就是选择性建立,而实现的难点在于如何选择性建立,我这里着重讲述的是从客户端传递参数的方式。对于什么时候选用简单工厂,能够从如下两个方面考虑:
优势
缺点