设计模式(一):单例模式和工厂模式

0

这是阅读《深入PHP面向对象、模式与实践》这本书途中写的笔记,这是一本非常好的书,里面只是用PHP为代码例子,讲了很多对其他语言开发也有帮助的知识。

1 单例模式

生成一个且只生成一个对象实例的特殊类,因此所有对象访问都会访问同一实例。
提供公共静态方法访问。

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
// demo
<?php
class Uni{
//创建静态私有的变量保存该类对象
static private $instance;
//参数
private $config;
//防止直接创建对象
private function __construct($config){
$this->config = $config;
echo "我被实例化了\n";
}
//防止克隆对象
private function __clone(){
// ...
}
static public function getInstance($config){
//判断$instance是否是Uni的对象
//没有则创建
if (!self::$instance instanceof self) {
self::$instance = new self($config);
}
return self::$instance;
}
public function getName(){
echo $this->config;
}
}
$db1 = Uni::getInstance(1);
$db1->getName();
echo "\n";
$db1 = Uni::getInstance(4); // 调用了$instance已保存的实例,因此$config没有赋值4
$db2->getName();
echo "\n";
/*输出
我被实例化了
1
1
*/
?>

2 工厂模式

工厂方法模式

定义一个用于创建对象的接口,让子类决定哪个类实例化。
使用工厂模式,减少代码耦合。

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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
// demo
<?php
// interface 人类
interface people
{
public function say();
}
class man implements people
{
// 实现people的say方法
function say()
{
echo "我是man\n";
}
}
class women implements people
{
// 实现people的say方法
function say()
{
echo "我是woman\n";
}
}
// 创建people接口
interface createPeople
{
public function create();
}
// 创建man对象接口
class FactoryMan implements createPeople
{
public function create()
{
return new man();
}
}
class FactoryWomen implements createPeople
{
function create()
{
return new women();
}
}
// 具体生产
class Factory
{
// 具体生产对象并执行对象方法测试
public function test()
{
$factory = new FactoryMan();
$man = $factory->create();
$man->say();
$factory = new FactoryWomen();
$man = $factory->create();
$man->say();
}
}

抽象工厂模式

与工厂方法模式类似,区别在于抽象出接口时提供一系列的创建对象方法

1
2
3
4
5
6
7
interface createPeople
{
// A B都是people但是不同属性
public function createA();
public function createB();
// ...
}

区别

工厂方法模式 :用来生产同一等级结构中的固定产品,支持增加任意产品。
抽象工厂模式 :用来生产不同产品种类的全部产品,不能增加新的产品,支持增加产品种类。

总结

面向对象、模式写代码可以将一些重复的代码片段提取出来,方便复用,需要修改时也很方便,修改一个类就可以了。同时代码结构也比较清晰。