设计模式第二讲(工厂模式)

  • 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类时,我也可以传递参数,提供高了代码扩展性。

使用场景

  1. 数据存储。就拿我们上面实例代码一样,我们需要将数据存储在不同的存储系统中时。
  2. 数据缓存。现在开发项目,会大量使用框架,框架在做缓存时,我们可以自行设置缓存驱动,也可以动态设置缓存渠道。

总结

工厂模式主要的优点在于降低了代码的耦合度,提高了代码的扩展性。