工厂方法源码解析(jdk+logback)
生活随笔
收集整理的這篇文章主要介紹了
工厂方法源码解析(jdk+logback)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
我們來(lái)看一下Collection,這個(gè)類(lèi)大家都比較熟悉,public interface Collection<E> extends Iterable<E> {是集合類(lèi),例如在這個(gè)接口中定義的Iterator接口,Iterator<E> iterator();這個(gè)方法就是一個(gè)工廠(chǎng)方法,Collection可以理解成一個(gè)抽象工廠(chǎng),那在后面講抽象工廠(chǎng)的時(shí)候呢,我們?cè)僦攸c(diǎn)關(guān)注抽象工廠(chǎng),而現(xiàn)在我們只關(guān)注工廠(chǎng)方法,工廠(chǎng)方法這個(gè)詞可以理解為作為工廠(chǎng)的一個(gè)方法,而Iterator這個(gè)方法呢,正是作為工廠(chǎng)的一個(gè)方法,這是一個(gè)接口,接口里面的一個(gè)方法,那他有很多實(shí)現(xiàn)類(lèi),例如ArrayList這里邊,對(duì)于iterator()方法的一個(gè)實(shí)現(xiàn)public Iterator<E> iterator() {return new Itr();
}這里面只用了一個(gè)內(nèi)部類(lèi)來(lái)實(shí)現(xiàn),private class Itr implements Iterator<E> 就是這個(gè),這里面就是全交由子類(lèi)來(lái)實(shí)現(xiàn)了,使用不同工廠(chǎng)類(lèi)中的iterator方法能夠得到不同的具體產(chǎn)品的實(shí)例,我們可以認(rèn)為ArrayList在這里邊是一個(gè)具體的實(shí)現(xiàn)工廠(chǎng),他呢實(shí)現(xiàn)了這個(gè)工廠(chǎng)方法,而具體的抽象產(chǎn)品呢,又是Iterator這么一個(gè)接口,public interface Iterator<E> 具體抽象產(chǎn)品已經(jīng)找到,那實(shí)際生產(chǎn)出來(lái)的產(chǎn)品呢,那就是ArrayList里面的Itr對(duì)象,private class Itr implements Iterator<E>這個(gè)就是具體的產(chǎn)品,他實(shí)現(xiàn)了Iterator接口,然后這里邊寫(xiě)這么一個(gè)實(shí)現(xiàn),同時(shí)在具體的工廠(chǎng)里面,返回了具體的產(chǎn)品,這個(gè)產(chǎn)品也就是說(shuō)Iterator抽象產(chǎn)品的一個(gè)實(shí)例,我們可以類(lèi)比來(lái)看,Collection相當(dāng)于我們里面的VideoFactory,ArrayList就相當(dāng)于具體的實(shí)現(xiàn)工廠(chǎng),例如JavaVideoFactory,PathonVideoFactory,而抽象產(chǎn)品,就是Iterator這么一個(gè)產(chǎn)品,而在我們的課程當(dāng)中,就是Video這么一個(gè)抽象類(lèi),它是一個(gè)抽象產(chǎn)品,然后實(shí)際的具體產(chǎn)品就是ArrayList里面的Itr這么一個(gè)類(lèi),他實(shí)現(xiàn)了抽象產(chǎn)品,那Itr對(duì)應(yīng)我們工廠(chǎng)里面的,就是JavaVideo,PathonVideo,或者FEVideo,那我們看一下,Itr這么一個(gè)類(lèi)圖
抽象產(chǎn)品,具體的ArrayList Itr實(shí)際的產(chǎn)品,而這個(gè)類(lèi)是和ArrayList是有依賴(lài)關(guān)系的,也就是說(shuō)ArrayList依賴(lài)他,因?yàn)镮tr作為iterator方法的一個(gè)返回值,也就是說(shuō)這個(gè)Itr類(lèi)型雖然是Iterator這個(gè)接口類(lèi)型,但是它是一個(gè)具體的產(chǎn)品,public Iterator<E> iterator() {return new Itr();
}private class Itr implements Iterator<E>例如這里可以看出來(lái),那我們來(lái)看一下ArrayList的一個(gè)類(lèi)圖
從這里面就可以看出來(lái),ArrayList實(shí)現(xiàn)的一個(gè)接口,以及和其他抽象類(lèi)的一個(gè)關(guān)系,那我們重點(diǎn)來(lái)關(guān)注一個(gè)方法,我們看一下ArrayList的方法,我們找到iterator這么一個(gè)方法,也就是說(shuō)ArrayList中的iterator方法
我們可以人工的看一下他們之間的關(guān)系,通過(guò)里面的類(lèi)實(shí)現(xiàn),他們之間的關(guān)系,所以這個(gè)就是一個(gè)工廠(chǎng)方法,在JDK重要的體現(xiàn),那我們現(xiàn)在看另外一個(gè)類(lèi),public interface URLStreamHandlerFactory 這樣一個(gè)類(lèi),首先它是一個(gè)接口,這個(gè)類(lèi)在JDK里面主要是解決URL協(xié)議擴(kuò)展使用的,這里面的protocol也就決定了交互規(guī)范,例如HTTP FILE,https,這些呢都是協(xié)議,那我們現(xiàn)在來(lái)理解一下,很明顯它是一個(gè)工廠(chǎng),并且這個(gè)工廠(chǎng)里面只有一個(gè)方法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);
}之前也說(shuō)了,無(wú)法具體描述的話(huà),我們使用抽象類(lèi)和抽象方法也可以,使用一個(gè)接口和一個(gè)方法命名,也是OK的,那么我們來(lái)看看他的具體實(shí)現(xiàn),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);}}
}這個(gè)Factory是一個(gè)靜態(tài)類(lèi),實(shí)現(xiàn)了URLStreamHandlerFactory,這里面定義了一個(gè)前綴,這個(gè)前綴就是給具體的類(lèi)使用的,比如說(shuō)這個(gè)是一個(gè)包名,然后點(diǎn),再加上var1,然后.Handler,為什么點(diǎn)Handler呢,以后我們來(lái)看一下,Class.forName,newInstance,來(lái)找到具體的產(chǎn)品,那前面我們講簡(jiǎn)單工廠(chǎng)的時(shí)候,通過(guò)Class.forName,對(duì)簡(jiǎn)單工廠(chǎng)進(jìn)行了一個(gè)擴(kuò)展,我們看一下他的返回值是URLStreamHandler,而這個(gè)類(lèi)呢如果實(shí)現(xiàn)工廠(chǎng)的話(huà),可以大膽猜測(cè)一下,他會(huì)不會(huì)是一個(gè)抽象類(lèi)呢,或者說(shuō)作為很多類(lèi)的一個(gè)父類(lèi),我們點(diǎn)進(jìn)來(lái)看一下,URLStreamHandler他是一個(gè)抽象類(lèi)
然后下邊有openConnection,是一個(gè)比較主要的方法
既然他返回的是一個(gè)抽象類(lèi)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;他肯定是由子類(lèi)來(lái)實(shí)現(xiàn)他的,這里面有N多Handler,有deploy發(fā)布包下面的
下面還有具體的協(xié)議,protocol.file協(xié)議,ftp協(xié)議,http,https,mial各種協(xié)議
我們先進(jìn)入http的Handler
這個(gè)Handler直接繼承了這個(gè)抽象類(lèi),那這個(gè)Handler里邊啊,openConnection方法抽象方法,并且它是一個(gè)protected,所以子類(lèi)必須會(huì)實(shí)現(xiàn)他,也就是說(shuō)openConnection,這個(gè)是http包下面的Handler,那我們?cè)倏匆幌缕渌膶?shí)現(xiàn)類(lèi),例如有一個(gè)https的
它是間接繼承,這個(gè)handler我們進(jìn)來(lái)
繼承下一個(gè)Handler,再進(jìn)來(lái)
這樣Handler繼承了URLStreamHandler,這個(gè)factory里面繼承了這個(gè)
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);
}里面提供了工廠(chǎng)方法,而createURLStreamHandler這個(gè)工廠(chǎng)方法的實(shí)現(xiàn)
里面通過(guò)Class.forName來(lái)獲取對(duì)象,而具體對(duì)象就是URLStreamFactory很多實(shí)現(xiàn)的一個(gè)子類(lèi)
那我們現(xiàn)在來(lái)對(duì)應(yīng)一下,URLStreamHandler對(duì)應(yīng)我們的Video,這個(gè)是抽象的產(chǎn)品,而這些都是具體的產(chǎn)品,URLStreamHandlerFactory,對(duì)應(yīng)的就是VideoFactory,這里面提供了一個(gè)方法,而這個(gè)方法createURLStreamHandler具體的實(shí)現(xiàn)呢,交由他的子類(lèi),Launcher這個(gè)類(lèi)來(lái)實(shí)現(xiàn)的
而具體這個(gè)方法的實(shí)現(xiàn),也就是這個(gè)工廠(chǎng)的實(shí)現(xiàn)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這么一個(gè)類(lèi)
他實(shí)現(xiàn)了URLStreamHandlerFactory,這個(gè)Factory就相當(dāng)于我們的JavaVideoFactory,PythonVideFactory,所以工廠(chǎng)方法所在的類(lèi),還有具體的創(chuàng)建者,還有抽象的產(chǎn)品,和具體的產(chǎn)品,我們都找到了,那這一部分也是工廠(chǎng)方法,在JDK中的一個(gè)重要體現(xiàn),我們?cè)倏磍ogback中的一些應(yīng)用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);
}這個(gè)接口下邊只有一個(gè)方法,我們看一下他的實(shí)現(xiàn),在這三個(gè)類(lèi)中
也就是把這個(gè)抽象方法教給子類(lèi)來(lái)實(shí)現(xiàn),我們來(lái)看一下類(lèi)圖
?
總結(jié)
以上是生活随笔為你收集整理的工厂方法源码解析(jdk+logback)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 工厂方法 coding
- 下一篇: 抽象工厂讲解