工厂模式就是负责将大量有共同接口的类实例,而不必事先知道要实例化哪一个类的模式。工厂模式一般分为三种:简单工厂模式、工厂方法模式、抽象工厂模式。从模式性质来说,工厂模式属于创建型模式。
简单工厂模式定义
通常负责创建实例工厂类接收一个条件(参数),来决定实例化哪一个产品类。简单工厂模式又被称为静态工厂模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。
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
|
<?php
// Simple Factory
interface
IAnimal {
function
Eat();
}
class
Dog
implements
IAnimal {
public
function
Eat() {
echo
"Dog Eat!"
;
echo
"<br/>"
;
}
}
class
Cat
implements
IAnimal {
public
function
Eat() {
echo
"Cat Eat!"
;
echo
"<br/>"
;
}
}
class
SimpleFactory {
function
CreateAnimal(
$animal_type
) {
switch
(
$animal_type
) {
case
'Dog'
:
return
new
Dog();
break
;
case
'Cat'
:
return
new
Cat();
break
;
default
:
exit
(
'Please provide the type of animal you wana to create!'
);
}
}
}
// Test
$simplefactory
=
new
SimpleFactory();
$dog
=
$simplefactory
->CreateAnimal(
'Dog'
);
$dog
->Eat();
$cat
=
$simplefactory
->CreateAnimal(
'Cat'
);
$cat
->Eat();
?>
|
优点
SimpleFactory根据接收不同的参数实例化不同的动物,对动物的实例化统一交给SimpleFactory工厂类来实现,客户端不必知道动物类的具体名称或者怎么去完成实例化,而只需使用SimpleFactory类以及对应的实例化某动物的参数(“Dog”或者”Cat”等)来实例某动物就可以了。
缺点
整个模式的关键是SimpleFactory类,其中SimpleFactory创建动物方法中包含了创建动物的关键逻辑,而这往往容易违反高内聚的责任分配原则,也违反开放-封闭原则,因为要添加新的动物时候,必须修改SimpleFactory的CreateAnimal方法,而开发-封闭原则是对扩展是开放的(Open for extension),而对修改是封闭的(Close for modification)。