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

文章导读

今天分享的是工厂模式.在分享公式模式之前,我们先看下面两张图.
图一显示的是,我们要组装一个苹果手机,需要根据我们使用的零件来定,比如芯片在美国,我们就需要跑到美国去拿芯片,需要屏幕,我们可能跑到日本去拿屏幕。然而图二就不一样了,不管你组装一个苹果手机需要多少零件,我直接找一个工厂,给工厂打声招呼,我需要什么零件,工厂按照你的需求提供相应的零件,至于这些零件,工厂如何去获取,这就不是我们组装手机所关心的,我们只关心我们需要的东西得到就行了。

将上面的逻辑放在我们程序中就可以这样理解了。我们创建一个商品类,要将商品存储起来,是存在Redis呢还是存在MySql中呢?(这里只是一个举例).如果我们存在MySQL中,这时候我们直接去new MysQL,然后做插库操作。通力,另外一个功能模块,比如文章添加,也是同样的道理,我选择存储MySQL中,这时候我们也可以去new MySQL,然后做插库操作。当系统中存在大量的这种场景,如果没有特殊的需求,我们都可以这样实现。

突然有这么一天,技术leader决定,我们不存MySQL了,我们存Redis中。这时候,我们岂不是得崩溃了,系统中全都是使用new MySQL去存储的,我一个个换,那不得搞死人,同时也会出现遗留的地方。这时候,就体现了工厂模式的好处来了。就像上面的图二一样,我不管你用什么方式存储,我商品类,文章类直接去找一个工厂类,调用插入方法就行了。至于你用什么存储方式,我直接去工厂模式修改一下就行了。

工厂模式的定义

工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式.[来自百度]

工厂模式是为了解决大量重复代码扩展性低导致代码耦合度高的场景的 一种设计模式.[个人理解]

工厂模式的优势

1.将大量重复的代码,封装在一个类中,减少了代码的耦合度。

2.避免代码在后期调整中,导致大量的修改,提高了代码的扩展性。

代码演示

创建接口类

1
2
3
4
5
6
7
8
9
10
11
12
13
/**
定义一个公共的接口,以及增删改查的接口方法
*/
interface Opreation{

public function insert();

public function select();

public function update();

public function delete();
}

创建Redis和MySQL存储的操作类,集成接口类的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
/**
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(){

}
}

创建工程类,去实例化缓存类

1
2
3
4
5
6
7
8
9
10
11
/**
定义工厂类,实例化类
*/
class Factor{

public $handle = '';

public function __construct($type='mysql'){
$this->handle = new ucwords($type);
}
}

创建实际的业务处理类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
/**
商品管理功能
*/
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. 数据缓存。现在开发项目,会大量使用框架,框架在做缓存时,我们可以自行设置缓存驱动,也可以动态设置缓存渠道。

总结

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