前言
介紹工廠模式,展示工廠模式的演化。
正文
看下工廠模式是如何演化的。
public interface ISplitter
{
void Splite();
}
class BinarySplitter : ISplitter
{
public void Splite()
{
throw new NotImplementedException();
}
}
class TxtSplitter : ISplitter
{
public void Splite()
{
throw new NotImplementedException();
}
}
class VideoSplitter : ISplitter
{
public void Splite()
{
throw new NotImplementedException();
}
}
假如有上面這些東西,分別是位元組切割、文字切割、聲音切割。
然後有一個類呼叫:
public class Application
{
public void doSomeThing()
{
ISplitter splitter = new TxtSplitter();
}
}
那麼問題來了,這樣寫好不好?
答案是不好,因為違反了依賴倒置原則。
依賴倒置原則(Dependence Inversion Principle)是程式要依賴於抽象介面,不要依賴於具體實現。簡單的說就是要求對抽象進行程式設計,不要對實現進行程式設計,這樣就降低了客戶與實現模組間的耦合。
new TxtSplitter() 依賴了具體的實現了,所以不符合。
那麼既然不能依賴具體的類,那麼如何獲取到TxtSplitter 物件呢?
既然不能依賴於類,那麼可以用方法返回。
class SplitterFactory
{
public static ISplitter CreateSplitter()
{
return new BinarySplitter();
}
}
好吧。
然後:
ISplitter splitter = SplitterFactory.CreateSplitter();
看這一行:ISplitter splitter = SplitterFactory.CreateSplitter();
splitter 是介面沒有依賴具體的實現,BinaryFactory.CreateSplitter()也沒有直接依賴具體的實現。
SplitterFactory.CreateSplitter()怎麼能說沒有直接依賴具體的實現呢?這個怎麼看呢?要從當前類Application來看,從Application來看,顯示建立一個SplitterFactory.CreateSplitter()
Application是不知道到底SplitterFactory.CreateSplitter() 建立了什麼,只有SplitterFactory知道。所以在Application沒有直接依賴具體實現。
但是問題就是application 沒有直接具體依賴,但是卻有間接具體依賴。
雖然在Application中解決了,但是在SplitterFactory還是有依賴BinarySplitter,這樣就形成了間接依賴。
就是這樣的。
這樣又一個什麼壞處呢?現在不用去修改Application 的程式碼了,因為抽象的,但是如果現在和Application 模型相同的,然後需要用到TxtSplitter。
那麼模型就是這樣的。
也就是說SplitterFactory的不穩定性導致了,導致了Application 複用性不行,增加了耦合。
那麼可以這樣:
public abstract class SplitterFactory
{
public abstract ISplitter CreateSplitter();
}
現在就不依賴任何東西了。
那麼這樣具體的工廠就要具體去實現。
class BinarySplitterFactory : SplitterFactory
{
public override ISplitter CreateSplitter()
{
return new BinarySplitter();
}
}
class TxtSplitterFactory : SplitterFactory
{
public override ISplitter CreateSplitter()
{
return new TxtSplitter();
}
}
class VideoSplitterFactory : SplitterFactory
{
public override ISplitter CreateSplitter()
{
return new VideoSplitter();
}
}
然後Application 這樣寫:
public class Application
{
SplitterFactory factory;
public Application(SplitterFactory factory)
{
this.factory = factory;
}
public void doSomeThing()
{
ISplitter splitter = factory.CreateSplitter();
}
}
這樣子,下圖就形成了穩定的。
幹了這麼多其實就是為了Application的穩定性。
概念圖
後續補。