日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

工厂方法源码解析(jdk+logback)

發布時間:2024/4/13 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 工厂方法源码解析(jdk+logback) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
我們來看一下Collection,這個類大家都比較熟悉,public interface Collection<E> extends Iterable<E> {是集合類,例如在這個接口中定義的Iterator接口,Iterator<E> iterator();這個方法就是一個工廠方法,Collection可以理解成一個抽象工廠,那在后面講抽象工廠的時候呢,我們再重點關注抽象工廠,而現在我們只關注工廠方法,工廠方法這個詞可以理解為作為工廠的一個方法,而Iterator這個方法呢,正是作為工廠的一個方法,這是一個接口,接口里面的一個方法,那他有很多實現類,例如ArrayList這里邊,對于iterator()方法的一個實現public Iterator<E> iterator() {return new Itr(); }這里面只用了一個內部類來實現,private class Itr implements Iterator<E> 就是這個,這里面就是全交由子類來實現了,使用不同工廠類中的iterator方法能夠得到不同的具體產品的實例,我們可以認為ArrayList在這里邊是一個具體的實現工廠,他呢實現了這個工廠方法,而具體的抽象產品呢,又是Iterator這么一個接口,public interface Iterator<E> 具體抽象產品已經找到,那實際生產出來的產品呢,那就是ArrayList里面的Itr對象,private class Itr implements Iterator<E>這個就是具體的產品,他實現了Iterator接口,然后這里邊寫這么一個實現,同時在具體的工廠里面,返回了具體的產品,這個產品也就是說Iterator抽象產品的一個實例,我們可以類比來看,Collection相當于我們里面的VideoFactory,ArrayList就相當于具體的實現工廠,例如JavaVideoFactory,PathonVideoFactory,而抽象產品,就是Iterator這么一個產品,而在我們的課程當中,就是Video這么一個抽象類,它是一個抽象產品,然后實際的具體產品就是ArrayList里面的Itr這么一個類,他實現了抽象產品,那Itr對應我們工廠里面的,就是JavaVideo,PathonVideo,或者FEVideo,那我們看一下,Itr這么一個類圖

抽象產品,具體的ArrayList Itr實際的產品,而這個類是和ArrayList是有依賴關系的,也就是說ArrayList依賴他,因為Itr作為iterator方法的一個返回值,也就是說這個Itr類型雖然是Iterator這個接口類型,但是它是一個具體的產品,public Iterator<E> iterator() {return new Itr(); }private class Itr implements Iterator<E>例如這里可以看出來,那我們來看一下ArrayList的一個類圖

從這里面就可以看出來,ArrayList實現的一個接口,以及和其他抽象類的一個關系,那我們重點來關注一個方法,我們看一下ArrayList的方法,我們找到iterator這么一個方法,也就是說ArrayList中的iterator方法

我們可以人工的看一下他們之間的關系,通過里面的類實現,他們之間的關系,所以這個就是一個工廠方法,在JDK重要的體現,那我們現在看另外一個類,public interface URLStreamHandlerFactory 這樣一個類,首先它是一個接口,這個類在JDK里面主要是解決URL協議擴展使用的,這里面的protocol也就決定了交互規范,例如HTTP FILE,https,這些呢都是協議,那我們現在來理解一下,很明顯它是一個工廠,并且這個工廠里面只有一個方法public interface URLStreamHandlerFactory {/*** Creates a new {@code URLStreamHandler} instance with the specified* protocol.** @param protocol the protocol ("{@code ftp}",* "{@code http}", "{@code nntp}", etc.).* @return a {@code URLStreamHandler} for the specific protocol.* @see java.net.URLStreamHandler*/URLStreamHandler createURLStreamHandler(String protocol); }之前也說了,無法具體描述的話,我們使用抽象類和抽象方法也可以,使用一個接口和一個方法命名,也是OK的,那么我們來看看他的具體實現,Launcher Factory createURLStreamHandlerprivate static class Factory implements URLStreamHandlerFactory {private static String PREFIX = "sun.net.www.protocol";private Factory() {}public URLStreamHandler createURLStreamHandler(String var1) {String var2 = PREFIX + "." + var1 + ".Handler";try {Class var3 = Class.forName(var2);return (URLStreamHandler)var3.newInstance();} catch (ReflectiveOperationException var4) {throw new InternalError("could not load " + var1 + "system protocol handler", var4);}} }這個Factory是一個靜態類,實現了URLStreamHandlerFactory,這里面定義了一個前綴,這個前綴就是給具體的類使用的,比如說這個是一個包名,然后點,再加上var1,然后.Handler,為什么點Handler呢,以后我們來看一下,Class.forName,newInstance,來找到具體的產品,那前面我們講簡單工廠的時候,通過Class.forName,對簡單工廠進行了一個擴展,我們看一下他的返回值是URLStreamHandler,而這個類呢如果實現工廠的話,可以大膽猜測一下,他會不會是一個抽象類呢,或者說作為很多類的一個父類,我們點進來看一下,URLStreamHandler他是一個抽象類

然后下邊有openConnection,是一個比較主要的方法

既然他返回的是一個抽象類public abstract class URLStreamHandler {/*** Opens a connection to the object referenced by the* {@code URL} argument.* This method should be overridden by a subclass.** <p>If for the handler's protocol (such as HTTP or JAR), there* exists a public, specialized URLConnection subclass belonging* to one of the following packages or one of their subpackages:* java.lang, java.io, java.util, java.net, the connection* returned will be of that subclass. For example, for HTTP an* HttpURLConnection will be returned, and for JAR a* JarURLConnection will be returned.** @param u the URL that this connects to.* @return a {@code URLConnection} object for the {@code URL}.* @exception IOException if an I/O error occurs while opening the* connection.*/abstract protected URLConnection openConnection(URL u) throws IOException;他肯定是由子類來實現他的,這里面有N多Handler,有deploy發布包下面的

下面還有具體的協議,protocol.file協議,ftp協議,http,https,mial各種協議

我們先進入http的Handler

這個Handler直接繼承了這個抽象類,那這個Handler里邊啊,openConnection方法抽象方法,并且它是一個protected,所以子類必須會實現他,也就是說openConnection,這個是http包下面的Handler,那我們再看一下其他的實現類,例如有一個https的

它是間接繼承,這個handler我們進來

繼承下一個Handler,再進來

這樣Handler繼承了URLStreamHandler,這個factory里面繼承了這個

public interface URLStreamHandlerFactory {/*** Creates a new {@code URLStreamHandler} instance with the specified* protocol.** @param protocol the protocol ("{@code ftp}",* "{@code http}", "{@code nntp}", etc.).* @return a {@code URLStreamHandler} for the specific protocol.* @see java.net.URLStreamHandler*/URLStreamHandler createURLStreamHandler(String protocol); }里面提供了工廠方法,而createURLStreamHandler這個工廠方法的實現

里面通過Class.forName來獲取對象,而具體對象就是URLStreamFactory很多實現的一個子類

那我們現在來對應一下,URLStreamHandler對應我們的Video,這個是抽象的產品,而這些都是具體的產品,URLStreamHandlerFactory,對應的就是VideoFactory,這里面提供了一個方法,而這個方法createURLStreamHandler具體的實現呢,交由他的子類,Launcher這個類來實現的

而具體這個方法的實現,也就是這個工廠的實現public interface URLStreamHandlerFactory {/*** Creates a new {@code URLStreamHandler} instance with the specified* protocol.** @param protocol the protocol ("{@code ftp}",* "{@code http}", "{@code nntp}", etc.).* @return a {@code URLStreamHandler} for the specific protocol.* @see java.net.URLStreamHandler*/URLStreamHandler createURLStreamHandler(String protocol); }就是使用Factory這么一個類

他實現了URLStreamHandlerFactory,這個Factory就相當于我們的JavaVideoFactory,PythonVideFactory,所以工廠方法所在的類,還有具體的創建者,還有抽象的產品,和具體的產品,我們都找到了,那這一部分也是工廠方法,在JDK中的一個重要體現,我們再看logback中的一些應用public interface ILoggerFactory {/*** Return an appropriate {@link Logger} instance as specified by the* <code>name</code> parameter.* * <p>If the name parameter is equal to {@link Logger#ROOT_LOGGER_NAME}, that is * the string value "ROOT" (case insensitive), then the root logger of the * underlying logging system is returned.* * <p>Null-valued name arguments are considered invalid.** <p>Certain extremely simple logging systems, e.g. NOP, may always* return the same logger instance regardless of the requested name.* * @param name the name of the Logger to return* @return a Logger instance */public Logger getLogger(String name); }這個接口下邊只有一個方法,我們看一下他的實現,在這三個類中

也就是把這個抽象方法教給子類來實現,我們來看一下類圖

?

總結

以上是生活随笔為你收集整理的工厂方法源码解析(jdk+logback)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。