概述
由于设计模式学习中需要配合UML图,所以先学习下UML的常用方法
UML结构类图的常用画法
Demo传送门
案例:有苹果,华为,三星三种电子产品供外界使用
普通模式的解决方法
这里我们采用面向协议编程的方式,也可以用继承方式,这里推荐面向协议
1.首先是定义一个协议,并规定协议的方法
协议里面先规定了一个方法- (void)createProduct;
,上面的枚举先不看,后面使用简单工厂的时候会用到
2.创建三种产品,并遵循协议,实现协议的方法
这里只贴出一种,其余两种处理方式一样
3.客户端引用如下:
鉴于普通方法下的劣势很容易就能看到,客户不但知道了接口,而且也知道了具体有谁去实现,接口的思想是"封装隔离",实现类应该是被接口隔离开的,也就是我们最好只知道 id<ProductProtocol>
但是不知道具体是谁 [[IPhoneProduct alloc] init]
显然我们是知道具体产品的
那么如果想要在不知道具体产品的情况下就能实现接口,该如何实现呢?下面简单讲述一下简单工厂的设计理念
简单工厂的设计
1.认识简单工厂
在开始用简单工厂实现上述案例之前,先来认识一下什么叫简单工厂
1.简单工厂的定义:
提供一个创建对象实例的功能,而无需关心其具体实现。被创建实例的类型可以使接口,抽象类或者具体的类。
简而言之,外界不知道一个工厂里面到底要生成什么样的实例对象,只需要传入一个标识,工厂内部自己就能生产对应的产品,工厂内部是知道具体产品的实现的,最后只需要返回给客户端一个遵循协议的对象即可,客户端拿到这个对象就能直接访问接口协议方法,而不需要关心具体的实现。
下面以一个UML结构图简单展示下简单工厂的结构图:
下面说明一下各个角色的功能和作用
- Client:客户端,通过工厂获取遵循协议的对象,之后就是面向协议编程
- ProductFactory:简单工厂,通过客户端传入的标识去创建遵循协议的接口对象
- ProductProtocol:定制客户所需要的功能接口,也就是协议
- IPhoneProduct,HuaWeiProduct,SanXingProduct:具体的实现类,实现协议规定的接口
2.代码实现简单工厂
接口协议定制
具体实现类
HuaWeiProduct,SanXingProduct类似
工厂类:
客户端实现:
通过上述代码可以看出,客户端是不知道接口的具体实现的,和具体实现类接触的类变成了工厂类,我们可以这么理解,工厂类,接口类和具体实现类作为一个封装体,暴露给外界的只是工厂类的一个类方法和接口类
后续如果需要再加另外的具体实现类,只需要新增实现类并在工厂类新增一个判断条件即可
优化方案:为了避免修改工厂类,还可以使用配置文件,在配置文件中配置好实现类相关的信息,实现类中需要有type,name(类名)等信息,下面我具体来实现以下:
大致实现思路就是这样,总的概括来说,简单工厂的本质就是选择性地去创建具体产品(实现类),工厂里面主要就是选择性创建,而实现的难点在于如何选择性创建,我这里着重讲述的是从客户端传递参数的方式。对于何时选用简单工厂,可以从以下两个方面考虑:
- 想要完全封装隔离具体实现,外部只能通过接口操作封装体
- 想要把对外创建的职责几种管理和控制
3.简单工厂的优缺点
优点
- 具有封装性,很好地实现了组件的封装,组件外部实现了面向接口编程
- 解耦性,实现了客户端和具体实现类的解耦合
缺点
- 可能会增加客户端的复杂度,因为客户端需要向工厂传递参数,就必得理解所传参数的含义
- 不方便扩展子工厂
最后
以上就是明理机器猫为你收集整理的简单工厂模式的结构和运用的全部内容,希望文章能够帮你解决简单工厂模式的结构和运用所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复