不一樣的工廠模式(設計模式六)

夢裡小探花發表於2020-08-31

前言

介紹工廠模式,展示工廠模式的演化。

正文

看下工廠模式是如何演化的。

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的穩定性。

概念圖

後續補。

相關文章