设计模式第二讲(工厂模式)
- 2019 年 11 月 12 日
- 筆記
需要仔细阅读文字内容部分
文章导读
今天分享的是工厂模式.在分享公式模式之前,我们先看下面两张图.
图一
图二
图一显示的是,我们要组装一个苹果手机,需要根据我们使用的零件来定,比如芯片在美国,我们就需要跑到美国去拿芯片,需要屏幕,我们可能跑到日本去拿屏幕。然而图二就不一样了,不管你组装一个苹果手机需要多少零件,我直接找一个工厂,给工厂打声招呼,我需要什么零件,工厂按照你的需求提供相应的零件,至于这些零件,工厂如何去获取,这就不是我们组装手机所关心的,我们只关心我们需要的东西得到就行了。
将上面的逻辑放在我们程序中就可以这样理解了。我们创建一个商品类,要将商品存储起来,是存在Redis呢还是存在MySql中呢?(这里只是一个举例).如果我们存在MySQL中,这时候我们直接去new MysQL,然后做插库操作。通力,另外一个功能模块,比如文章添加,也是同样的道理,我选择存储MySQL中,这时候我们也可以去new MySQL,然后做插库操作。当系统中存在大量的这种场景,如果没有特殊的需求,我们都可以这样实现。
突然有这么一天,技术leader决定,我们不存MySQL了,我们存Redis中。这时候,我们岂不是得崩溃了,系统中全都是使用new MySQL去存储的,我一个个换,那不得搞死人,同时也会出现遗留的地方。这时候,就体现了工厂模式的好处来了。就像上面的图二一样,我不管你用什么方式存储,我商品类,文章类直接去找一个工厂类,调用插入方法就行了。至于你用什么存储方式,我直接去工厂模式修改一下就行了。
工厂模式的定义
工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式.[来自百度]
工厂模式是为了解决大量重复代码,扩展性低导致代码耦合度高的场景的 一种设计模式.[个人理解]
工厂模式的优势
1.将大量重复的代码,封装在一个类中,减少了代码的耦合度。
2.避免代码在后期调整中,导致大量的修改,提高了代码的扩展性。
代码演示
创建接口类
/**定义一个公共的接口,以及增删改查的接口方法*/interface Opreation{ public function insert(); public function select(); public function update(); public function delete();}
创建Redis和MySQL存储的操作类,集成接口类的方法
/**Redis 操作类*/class Redis implements Opreation{ public function insert(){ } public function select(){ } public function update(){ } public function delete(){ }} /**MySql 操作类*/class Mysql implements Opreation{ public function insert(){ } public function select(){ } public function update(){ } public function delete(){ }}
创建工程类,去实例化缓存类
/**定义工厂类,实例化类*/class Factor{ public $handle = ''; public function __construct($type='mysql'){ $this->handle = new ucwords($type); }}
创建实际的业务处理类
/** 商品管理功能 */class Goods{ // 查询商品 public function lists () { $model = new Factor(); $model->select(); } // 删除商品 public function del () { $model = new Factor(); $model->delete()(); }} /** * 文章管理功能 */class Article{ // 添加文章 public function add () { $model = new Factor(); $model->insert(); } // 修改文章 public function edit () { $model = new Factor(); $model->update(); }}
通过上面的实例代码,我们不难看出,这样写的扩展性,以及代码的低耦合度。当我文章类和商品类如果需要存储Redis时,我直接去Factory类的构造函数修改即可,同时在实例化Factory类时,我也可以传递参数,提供高了代码扩展性。
使用场景
- 数据存储。就拿我们上面实例代码一样,我们需要将数据存储在不同的存储系统中时。
- 数据缓存。现在开发项目,会大量使用框架,框架在做缓存时,我们可以自行设置缓存驱动,也可以动态设置缓存渠道。
总结
工厂模式主要的优点在于降低了代码的耦合度,提高了代码的扩展性。