工厂模式的定义:在现实生活中,如同工厂生产产品,3D打印机打印模型一样。对象的创建通过工厂类来产生。
根据实现的模式不同,工厂模式又分为3中:
-
简单工厂模式:定义了一个创建对象的类,由这个类来封装实例化对象的行为
-
工厂方法模式:定义了一个创建对象的抽象方法,由子类决定要实例化的类。工厂方法模式将对象的实例化推迟到子类
-
抽象工厂模式:定义了一个接口用于创建相关或有依赖关系的对象族,而无需明确指定具体类
代码示例:
首先来看看第一种:
1
2
3
4
5
6
7
8
9
10
11
|
//简单工厂类根据传入的参数实现对象的实例化
public
class
SimpleDrinkFactory {
public
Drink createProduct(String name){
if
(
"百事可乐"
.equals(name)){
return
new
BaiShi();
}
else
{
return
new
JiaDuoBao();
}
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
public
abstract
class
Drink {
private
String name;
public
void
showName(){
System.out.println(name);
}
public
void
setName(String name){
this
.name = name;
}
}
public
class
BaiShi
extends
Drink {
public
BaiShi() {
super
.setName(
"百事可乐"
);
}
}
public
class
JiaDuoBao
extends
Drink {
public
JiaDuoBao() {
super
.setName(
"加多宝"
);
}
}
|
1
2
3
4
5
6
7
8
|
public
class
SimpleMain {
public
static
void
main(String[] args) {
SimpleDrinkFactory simpleDrinkFactory =
new
SimpleDrinkFactory();
Drink drink = simpleDrinkFactory.createProduct(
"百事可乐"
);
drink.showName();
}
}
|
工厂方法模式:定义了一个抽象工厂类,产品的产生方法需要由工厂子类实现,且每个工厂子类只能产生一个具体产品
1
2
3
|
public
abstract
class
Factory {
public
abstract
Drink createProduct();
}
|
1
2
3
4
5
6
|
public
class
BaiShiFactory
extends
Factory {
@Override
public
Drink createProduct() {
return
new
BaiShi();
}
}
|
抽象工厂模式:定义一个抽象工厂类,产品的产生方法由工厂子类实现,且每个工厂子类能产生多个具体的产品
1
2
3
|
public
abstract
class
Factory {
public
abstract
Drink createProduct(String name);
}
|
1
2
3
4
5
6
7
8
|
@Override
public
Drink createProduct(String name){
if
(
"百事可乐"
.equals(name)){
return
new
BaiShi();
}
else
{
return
new
JiaDuoBao();
}
}
|
其实抽象工厂跟工厂方法模式比较模糊,他们具体区别如下:
工厂方法模式:
一个抽象产品类,可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类只能创建一个具体产品类的实例。
抽象工厂模式:
多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类可以创建多个具体产品类的实例。
区别:
工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。