应用最广泛的模式-工厂方法模式
模式简介
创建型设计模式,定义一个用于创建对象的接口,让子类决定实例化哪个类。
使用场景
在任何需要生成复杂对象的地方,都可以使用工厂模式。复杂对象适合使用工厂模式,用new就可以完成创建的对象无需使用工厂模式
简单实现
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
65
66
67
68
69
70
|
//功能的抽象基类
public abstract class AudiCar {
//驾驶函数
public abstract void drive();
//自动巡航函数
public abstract void selfNavigation();
}
//生产线类
public class AudiCarFactory extends AudiFactory {
public <T extends AudiCar> T creatAudiCar(Class<T> tclass) {
AudiCar audiCar=null;
try{
audiCar=(AudiCar) Class.forName(tclass.getName()).newInstance();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return (T)audiCar;
}
}
//工厂抽象类
public abstract class AudiFactory {
//某车型的工厂方法
public abstract <T extends AudiCar>T creatAudiCar(Class<T> tclass);
}
//产品类A
public class AudiQ3 extends AudiCar {
public void drive() {
System.out.println("Q3发动了!!");
}
public void selfNavigation() {
System.out.println("Q3开始了自动巡航!!");
}
}
//产品类B
public class AudiQ5 extends AudiCar {
public void drive() {
System.out.println("Q5发动了!!");
}
public void selfNavigation() {
System.out.println("Q5开始了自动巡航!!");
}
}
//演示DEMO类
public class Client {
public static void main(String[] args) {
AudiFactory audiFactory=new AudiCarFactory();
AudiQ3 audiQ3=audiFactory.creatAudiCar(AudiQ3.class);
audiQ3.drive();
audiQ3.selfNavigation();
AudiQ5 audiQ5=audiFactory.creatAudiCar(AudiQ5.class);
audiQ5.drive();
audiQ5.selfNavigation();
}
}
|
执行结果
1
2
3
4
|
Q3发动了!!
Q3开始了自动巡航!!
Q5发动了!!
Q5开始了自动巡航!!
|
缺点
每次为工厂方法模式添加新的产品时就要编写一个新的产品类,同时还要引入抽象层,这必然会导致类结构的复杂化,所以,在情况比较简单的时候可能不适用使用工厂方法模式。需要我们自己去衡量