前言撕捍,再前面我們已經(jīng)學(xué)習(xí)了單例設(shè)計(jì)模式象对,今天我們來學(xué)習(xí)工廠方法設(shè)計(jì)模式,這個(gè)理解起來還是比較簡(jiǎn)單的烟具。
1. 為什么需要工廠方法模式
工廠方法模式意在分離產(chǎn)品與創(chuàng)建的兩個(gè)層次,使得用戶在一個(gè)工廠池中可以選擇想使用的產(chǎn)品奠蹬,而忽略其創(chuàng)建過程朝聋。進(jìn)一步說,就像一個(gè)大型工廠囤躁,對(duì)消費(fèi)者而言冀痕,只需知道都有什么工廠的產(chǎn)品生產(chǎn)出來,而不必關(guān)注產(chǎn)品是如何生產(chǎn)的狸演,但對(duì)于工廠來說言蛇,需要知道產(chǎn)品的制造過程
2 流程結(jié)構(gòu)圖.
首先,我們定義一個(gè)工廠的接口严沥,然后可以又多個(gè)實(shí)現(xiàn)的類猜极,每一個(gè)實(shí)現(xiàn)類去調(diào)用實(shí)現(xiàn)了具體接口的實(shí)現(xiàn)類,來創(chuàng)建一個(gè)類消玄,話不多說跟伏,直接看代碼。
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 { //具體的實(shí)現(xiàn)類
10 void run();
11 }
12
13 public class AudiFactory implements CarFactory {//不同的實(shí)現(xiàn)工廠類
14
15 @Override
16 public Car createCar() {
17 // TODO Auto-generated method stub
18 return new Audi();//這里創(chuàng)建我們的具體實(shí)現(xiàn)類
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 // 調(diào)用具體的實(shí)現(xiàn)類兔跌,然后再去調(diào)用不同的實(shí)現(xiàn)勘高,得到不同的實(shí)現(xiàn)
//結(jié)果
79 Car c1 = new AudiFactory().createCar();
80 Car c2 = new BydFactory().createCar();
81
82 c1.run();
83 c2.run();
84 }
85
86 }
3.適用場(chǎng)景
* 當(dāng)一個(gè)類不知道它所必須創(chuàng)建的對(duì)象的類的時(shí)候。
* 當(dāng)一個(gè)類希望由他的子類來制定它所創(chuàng)建的對(duì)象的時(shí)候
* 當(dāng)類創(chuàng)建對(duì)象的職責(zé)委托給多個(gè)幫助子類中的某一個(gè)坟桅,并且希望進(jìn)行一些信息的局部初始化的時(shí)候华望。
4.實(shí)際應(yīng)用
應(yīng)用場(chǎng)景:
1.JDK中Calendar的getInstance方法
2.Spring中IOC容器創(chuàng)建管理bean對(duì)象
3.Hibernate中SessionFactory創(chuàng)建Session
4.JDBC中Connection對(duì)象的獲取
5.XML解析時(shí)DocumentBuilderFactory創(chuàng)建解析工廠
6.反射中Class對(duì)象的newInstance()
個(gè)人GitHub項(xiàng)目,記錄學(xué)習(xí)Java知識(shí)的過程 歡迎star