前言,再前面我们已经学习了单例设计模式,今天我们来学习工厂方法设计模式,这个理解起来还是比较简单的。
1. 为什么需要工厂方法模式
工厂方法模式意在分离产品与创建的两个层次,使得用户在一个工厂池中可以选择想使用的产品,而忽略其创建过程。进一步说,就像一个大型工厂,对消费者而言,只需知道都有什么工厂的产品生产出来,而不必关注产品是如何生产的,但对于工厂来说,需要知道产品的制造过程
2 流程结构图.
首先,我们定义一个工厂的接口,然后可以又多个实现的类,每一个实现类去调用实现了具体接口的实现类,来创建一个类,话不多说,直接看代码。
1 package org.factory.factorymethod;
2
3 public interface CarFactory { //我们的工厂类
4 Car createCar();
5 }
6
7 package org.factory.factorymethod;
8
9 public interface Car { //具体的实现类
10 void run();
11 }
12
13 public class AudiFactory implements CarFactory {//不同的实现工厂类
14
15 @Override
16 public Car createCar() {
17 // TODO Auto-generated method stub
18 return new Audi();//这里创建我们的具体实现类
19 }
20
21 }
22
23 public class BydFactory implements CarFactory {
24
25 @Override
26 public Car createCar() {
27 // TODO Auto-generated method stub
28 return new Byd();
29 }
30
31 }
32
33 public class BenzFactory implements CarFactory {
34
35 @Override
36 public Car createCar() {
37 // TODO Auto-generated method stub
38 return new Benz();
39 }
40
41 }
42
43 public class Audi implements Car {
44
45 @Override
46 public void run() {
47 // TODO Auto-generated method stub
48 System.out.println("奥迪再跑!");
49 }
50
51 }
52
53 public class Benz implements Car {
54
55 @Override
56 public void run() {
57 // TODO Auto-generated method stub
58 System.out.println("奔驰再跑!");
59 }
60
61 }
62
63 public class Byd implements Car {
64
65 @Override
66 public void run() {
67 // TODO Auto-generated method stub
68 System.out.println("比亚迪再跑!");
69 }
70
71 }
72
73 package org.factory.factorymethod;
74
75 public class Client {
76
77 public static void main(String[] args) {
78 // 调用具体的实现类,然后再去调用不同的实现,得到不同的实现
//结果
79 Car c1 = new AudiFactory().createCar();
80 Car c2 = new BydFactory().createCar();
81
82 c1.run();
83 c2.run();
84 }
85
86 }
3.适用场景
* 当一个类不知道它所必须创建的对象的类的时候。
* 当一个类希望由他的子类来制定它所创建的对象的时候
* 当类创建对象的职责委托给多个帮助子类中的某一个,并且希望进行一些信息的局部初始化的时候。
4.实际应用
应用场景:
1.JDK中Calendar的getInstance方法
2.Spring中IOC容器创建管理bean对象
3.Hibernate中SessionFactory创建Session
4.JDBC中Connection对象的获取
5.XML解析时DocumentBuilderFactory创建解析工厂
6.反射中Class对象的newInstance()
个人GitHub项目,记录学习Java知识的过程 欢迎star