1、工厂模式介绍:html
工厂模式实现了建立者和调用者的分离java
工厂模式分类:spring
1.简单工厂模式编程
2.工厂方法模式:定义一个用于建立对象的接口,让子类决定实例化哪个类,工厂方法使一个类的实例化延迟到其子类设计模式
3.抽象工厂模式:提供一个建立一系列相关或相互依赖对象的接口,而无需指定它们具体的类。ide
面向对象设计的基本原则:学习
OCP(开闭原则,Open-Closed Principle):测试
一个软件的实体应当对扩展开放,对修改关闭。也就是说若是你要对一个已存在的系统作扩展的时候尽可能要新增长类,而不是在原有的基础上修改。ui
DIP(依赖倒转原则,Dependence Inversion Principle)spa
针对接口编程,不要针对实现编程。
LoD(迪米特法则,Law Of Demeter)
只与你直接的朋友通讯,而避免和陌生人通讯。一个类尽可能少的依赖其余类
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
|
//汽车接口
public
interface
Car {
void
run();
}
//奥迪
public
class
Audi
implements
Car {
@Override
public
void
run() {
System.out.println(
"奥迪在跑"
);
}
}
//比亚迪
public
class
Byd
implements
Car {
@Override
public
void
run() {
System.out.println(
"比亚迪在跑。"
);
}
}
//汽车测试类
public
class
TestCar {
//调用者
public
static
void
main(String[] args) {
Car c1 =
new
Byd();
Car c2 =
new
Audi();
c1.run();
c2.run();
//未使用工厂模式的时候,调用者会依赖不少类。违反了开闭原则
}
}
|
一、简单工厂模式:虽然能经过工厂来建立对象,可是违反了开闭原则。一旦增长功能须要在原有基础上修改代码。
使用了简单工厂模式后:能够建立一个工厂类,该类中提供一个建立汽车的工厂(方法)
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
|
//汽车工厂
public
class
CarFactory {
/**
* 建立汽车
* @param type
* @return
*/
public
static
Car createCar(String type){
//该方法还会有问题,假如之后有不少汽车都须要工厂来建立。则又得修改源代码,违反了OCP开闭原则
if
(
"audi"
.equals(type)) {
return
new
Audi();
}
else
if
(
"byd"
.equals(type)) {
return
new
Byd();
}
else
{
return
null
;
}
}
}
//测试简单工厂方法
public
class
TestSimpleFactoryCar {
//调用者
public
static
void
main(String[] args) {
//建立汽车
Car audi = CarFactory.createCar(
"audi"
);
//建立者
Car byd = CarFactory.createCar(
"byd"
);
audi.run();
byd.run();
}
}
|
二、工厂方法模式:将工厂类调整为工厂接口,须要什么类型的工厂就使用该类实现该工厂,建立相应的产品。
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
|
//工厂接口
public
interface
CarFactory {
//建立汽车方法
Car createCar();
}
//建立比亚迪汽车的工厂
public
class
BydFactory
implements
CarFactory{
@Override
public
Car createCar() {
return
new
Byd();
}
}
//建立奥迪的工厂
public
class
AudiFactory
implements
CarFactory {
@Override
public
Car createCar() {
return
new
Audi();
}
}
//测试工厂方法
public
class
TestFactoryMethod {
public
static
void
main(String[] args) {
/**
* 工厂方法模式好处在于,之后若是再增长一辆车。只需再实现CarFactory接口便可。避免了OCP开闭原则
* 不用在原来的代码上修改,只需新增类便可。
* 例如:增长一辆奔驰,增长一个奔驰工厂BenzFactory便可。更好扩展
*/
Car audi =
new
AudiFactory().createCar();
Car byd =
new
BydFactory().createCar();
audi.run();
byd.run();
}
}
|
三、抽象工厂模式:抽象工厂模式用来生产不一样产品族的所有产品,对于只增长产品某一部分则不适用。抽象工厂模式是工厂模式的一种升级版本。
在有多个业务品种,业务分类时,抽象工厂能产品不一样类别的一个所有产品。例如:生产汽车,抽象工厂模式能够生产高端汽车所有配件来组成一个高端汽车,
低端汽车所有配件来组成要给低端的汽车,可是不能产生一个高端的发动机和一个低端的座椅来组成一个中等的汽车。这样会混乱。
代码实现:
首先使用一个接口来定义一个发动机,使用具体的类来定义发动机的好坏(具体实现)
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
|
/**
* 发动机接口
*/
public
interface
Engine {
void
run();
void
start();
}
//好的发动机
class
LuxuryEngine
implements
Engine{
@Override
public
void
run() {
System.out.println(
"好发动机转的快"
);
}
@Override
public
void
start() {
System.out.println(
"启动快,自动启停"
);
}
}
//差的发动机
class
LowEngine
implements
Engine{
@Override
public
void
run() {
System.out.println(
"转的慢"
);
}
@Override
public
void
start() {
System.out.println(
"启动慢"
);
}
}
|
定义一个汽车总工厂,用来生产各类类型的汽车。全部的汽车都须要依赖此工厂来生产汽车。
1
2
3
4
5
6
7
8
|
/**
* 汽车总工厂,能够建立轮胎,座椅,发动机
*/
public
interface
CarFactory {
Engine createEngine();
//建立发动机
Seat createSeat();
//建立座椅
Tyre createTyre();
//建立轮胎
}
|
而后根据生产的不一样产品,类建立具体的实现来生产汽车。例如:专门生产高端的汽车,专门生产低端的汽车。均可以用针对CarFactory具体的实现来建立。
高端汽车制造工厂,全部汽车的生产必须依赖汽车总工厂
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
/**
* 高端汽车制造工厂
*/
public
class
LuxuryCarFactory
implements
CarFactory{
@Override
public
Engine createEngine() {
return
new
LuxuryEngine();
}
@Override
public
Seat createSeat() {
return
new
LuxurySeat();
}
@Override
public
Tyre createTyre() {
return
new
LuxuryTyre();
}
}
|
低端汽车制造工厂,全部汽车的生产必须依赖汽车总工厂
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
/**
* 低端汽车制造工厂
*/
public
class
LowCarFactory
implements
CarFactory{
@Override
public
Engine createEngine() {
return
new
LowEngine();
}
@Override
public
Seat createSeat() {
return
new
LowSeat();
}
@Override
public
Tyre createTyre() {
return
new
LowTyre();
}
}
|
具体生产汽车的时候就能够根据须要来建立具体的汽车了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
public
static
void
main(String[] args) {
//想要好车
CarFactory factory =
new
LuxuryCarFactory();
Engine engine = factory.createEngine();
//建立高端发动机
engine.run();
engine.start();
//想要差一点的车
CarFactory factory2 =
new
LowCarFactory();
Engine e2= factory2.createEngine();
Seat s2 = factory2.createSeat();
Tyre t2 = factory2.createTyre();
e2.run();
e2.start();
//之后想要中等车的话能够增长相应中等配件的接口
}
|
以上就是一个针对产品族的工厂,用来生产一个产品,而不是一个配件。假如之后想生产一个中端汽车产品。就能够增长相应的类,实现汽车总工厂CarFactory
来生产。
3、工厂模式要点
简单工厂模式(静态工厂模式)
虽然某种程度不符合面向对象规则(不符合开闭原则,每次新增内容都须要在原有代码上修改),可是实际使用最多。
工厂方法模式
不修改已有类的前提下,经过增长新类来实现扩展。
抽象工厂模式
不能够增长产品中某一个配件,能够增长一个具体的产品族。
4、应用场景
JDK中的Calendar的getInstance方法
JDBC中Connection对象的获取getConnection
Hibernate中SessionFactory建立Session
spring中的IOC容器建立管理bean对象的时候也是工厂模式
XML解析时的DocumentBuilderFactory建立解析器对象
反射中Class对象的newInstance方法。
参考资料:
大话设计模式(带目录完整版).pdf
HEAD_FIRST设计模式(中文版).pdf
尚学堂_高淇_java300集最全视频教程_【GOF23设计模式】