简单工厂模式:
简单工厂模式又叫做静态工厂(Static Factory)模式,但不属于23种GOF设计模式之一。简单工厂模式是根据传入的参数决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单但最实用的模式。
下面以生产车的工厂案例来展示简单工厂模式:
//抽象产品类
public interface Car {
void run();
}
//具体产品类
public class Audi implements Car {
@Override
public void run() {
System.out.println("奥迪runing");
}
}
//具体产品类
public class Byd implements Car {
@Override
public void run() {
System.out.println("比亚迪runing");
}
}
//生产车的工厂类
public class CarFactory {
public static Car createCar(String type) {
if("奥迪".equals(type)) {
return new Audi();
}else if ("比亚迪".equals(type)) {
return new Byd();
}else {
return null;
}
}
}
//调用者类
public class FactoryDemo01 {
public static void main(String[] args) {
Car c1 = CarFactory.createCar("奥迪");
Car c2 = CarFactory.createCar("比亚迪");
c1.run();
c2.run();
}
}

工厂方法模式:
由于简单工厂模式对于增加新产品无能为力,不修改代码的话,无法扩展,也就是不完全符合开闭原则。工厂方法模式可以避免这个缺点,工厂方法模式和简单工厂模式最大的不同在于,简单工厂模式只有一个(对于一个项目或者一个独立模块而言)工厂类,而工厂方法模式有一组实现了相同接口的工厂类。
1 //抽象工厂类
2 public interface CarFactorys {
3 Car createCar();
4 }
5
6 //抽象产品类
7 public interface Car {
8 void run();
9 }
10
11 //具体工厂类
12 public class AudiFactory implements CarFactorys {
13 @Override
14 public Car createCar() {
15 return new Audi();
16 }
17 }
18
19 //具体工厂类
20 public class BydFactory implements CarFactorys {
21 @Override
22 public Car createCar() {
23 return new Byd();
24 }
25 }
26
27 //调用者类
28 public class FactoryDemo2 {
29
30 public static void main(String[] args) {
31 Car c1 = new AudiFactory().createCar();
32 Car c2 = new BydFactory().createCar();
33 c1.run();
34 c2.run();
35 }
36 }

简单工厂模式和工厂方法模式比较:
- 结构复杂度:
从这个角度看,简单工厂模式显然更占优势,因为它只需一个工厂类,而工厂方法需要为每个产品类设置工厂类,这无疑使类的个数越来越多,从而导致结构更复杂。
- 代码复杂度:
代码复杂度和结构复杂度是一对矛盾,简单工厂模式的工厂类随着产品类的增加需要增加很多方法,而工厂方法模式每个具体工厂类只完成单一任务,代码简洁。
- 客户端编程难度:
工厂方法模式虽然在工厂类结构中引入了接口从而满足了开闭原则,但是在客户端编码中需要对工厂类进行实例化,而简单工厂模式的工厂类是个静态类,在客户端无需实例 化,这无疑是个吸引人的优点。
- 管理上的难度:
首先从扩展性上来说,工厂方法模式完全满足开闭原则,即拥有非常良好的扩展性,那是否说明简单工厂模式就没有扩展性呢?答案是否定的,简单工厂模式同样具备良好的扩展性--扩展的时候仅需修改少了代码(工厂类的代码)就可以达到扩展的要求然后从维护性上来说,假如某个具体产品类需要进行一定的修改,很可能需要修改对应的工厂类。当同时需要修改多个产品类的时候,对工厂类的修改会变得相当麻烦,反而简单工厂没有这些麻烦,当多个产品类需要修改时,简单工厂模式仍然仅需修改唯一的工厂类。
选择:根据设计理论建议是选择工厂方法模式,但实际上,一般是用简单工厂模式。
抽象工厂模式:
- 用来生产不同产品族的全部产品(对于增加新的产品无能为力,支持增加产品族)
- 抽象工厂模式是工厂方法的升级版,在有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。
1 //抽象产品类
2 public interface Engine {
3
4 void run();
5 void start();
6 }
7
8 //具体产品类
9 class LuxuryEngine implements Engine{
10 @Override
11 public void run() {
12
13 System.out.println("转的飞快");
14 }
15 @Override
16 public void start() {
17
18 System.out.println("启动快!");
19 }
20 }
21
22 //具体产品类
23 class LowEngine implements Engine{
24
25 @Override
26 public void run() {
27 System.out.println("转的慢");
28 }
29
30 @Override
31 public void start() {
32 System.out.println("启动慢!");
33 }
34
35 }
36
37 //抽象产品类
38 public interface Seat {
39
40 void massage();
41 }
42
43 //具体产品类
44 class LuxurySeat implements Seat{
45 @Override
46 public void massage() {
47 System.out.println("可以自动按摩");
48 }
49 }
50
51 //具体产品类
52 class LowSeat implements Seat{
53 @Override
54 public void massage() {
55 System.out.println("不能按摩!");
56 }
57 }
58
59 //抽象产品类
60 public interface Tyre {
61 void revolve();
62 }
63
64 //具体产品类
65 class LuxuryTyre implements Tyre{
66 @Override
67 public void revolve() {
68 System.out.println("橡胶耐磨!");
69 }
70 }
71
72 //具体产品类
73 class LowTyre implements Tyre{
74 @Override
75 public void revolve() {
76 System.out.println("橡胶磨损快!");
77 }
78 }
79
80 //抽象工厂类
81 public interface CarFactory {
82
83 Engine createEngine();
84 Seat createSeat();
85 Tyre createTyre();
86 }
87
88 //具体工厂类(生产的是一个产品族)
89 public class LowCarFactory implements CarFactory{
90 @Override
91 public Engine createEngine() {
92 return new LowEngine();
93 }
94
95 @Override
96 public Seat createSeat() {
97 return new LowSeat();
98 }
99
100 @Override
101 public Tyre createTyre() {
102 return new LowTyre();
103 }
104 }
105
106 //具体工厂类(生产的是一个产品族)
107 public class LuxuryCarFactory implements CarFactory{
108
109 @Override
110 public Engine createEngine() {
111 return new LuxuryEngine();
112 }
113
114 @Override
115 public Seat createSeat() {
116 return new LuxurySeat();
117 }
118
119 @Override
120 public Tyre createTyre() {
121 return new LowTyre();
122 }
123 }
124
125 //调用者类
126 public class Client {
127
128 public static void main(String[] args) {
129 CarFactory factory = new LuxuryCarFactory();
130 Engine e = factory.createEngine();
131 e.run();
132 e.start();
133 }
134 }
总结:
--简单工厂模式(静态工厂模式)
虽然某种程度不符合设计原则,但实际使用最多。
--工厂方法模式
不修改已有类的前提下,通过增加新的工厂类实现扩展
--抽象工厂模式
不可以增加产品,可以增加产品族
应用场景:
- JDK中Calendar的getInstance方法
- JDBC中Connection对象的获取
- 反射中Class对象的newInstance()
- XML解析时的DocumentBuilderFactory创建解析器对象
- Spring中IOC容器创建管理bean对象
来源:https://www.cnblogs.com/jie-y/p/10758759.html