第一個例子 普通的多态
第二個例子 運用工廠解除依賴耦合
第三個例子 剛是運用了依賴注入徹底解耦 借用spring.net
(1)也許有人說,IoC和工廠模式不是一樣的作用嗎,用IoC好象還麻煩一點。
舉個例子,如果使用者需求發生變化,要把Chinese類修改一下。那麼前一種工廠模式,就要更改Factory類的方法,并且重新編譯布署。而IoC隻需要将class屬性改變一下,這些對象是動态生成的,這時我們就可以熱插撥Chinese對象(不必把原程式停止下來重新編譯布署)
(2)也許有人說,即然IoC這麼好,那麼我把系統所有對象都用IoC方式來生成。
注意,IoC的靈活性是有代價的:設定步驟麻煩、生成對象的方式不直覺、比正常生成對象在效率上慢一點。是以使用IoC要看有沒有必要,我認為比較通用的判斷方式是:用到工廠模式的地方都可以考慮用IoC模式。
(3)關于IoC的低侵入性。
什麼是低侵入性?如果你用過MVC或Nhibernate就會發現,要繼承一些接口或類,才能利用它們的架構開發。這樣,系統就被綁定在MVC、Nhibernate上了,對系統的可移植性産生不利的影響。如果代碼中很少涉及某一個架構的代碼,那麼這個架構就可以稱做是一個低侵入性的架構。
第一個例子是最明顯的耦合 他沒有畫圖 我給加了張圖 vs中自帶的類圖裡怎麼也找不着依賴的箭頭...我自己畫了個箭頭 不是很好看...!
/// <summary>

/// 抽象人類
/// </summary>
public abstract class Person
{
/// <summary>

/// 使用工具勞動
/// </summary>

public abstract void Work();
}
public interface ITool

/// 使用工具

void UseTool();
場景一,原始社會:原始人使用長矛打獵
public class Spear : ITool

public void UseTool()
{

Console.WriteLine("使用長矛");
}
public class PrimitivePerson : Person

/// 原始社會使用長矛打獵

public override void Work()

//知道打獵使用的是長矛,并且制造長矛

ITool tool = new Spear();

tool.UseTool();

Console.WriteLine("使用長矛打獵");
從上面代碼我們不難看出,雖然使用的經典的裡氏替換原則,但PrimitivePerson類于Spear類存在着耦合。
第二段代碼 運用工廠
可以看到它加了一個工廠 包裝了執行個體化 使得PrimitivePerson與Hoe沒有直接存在耦合 但是工廠與PrimitivePerson之間還是有關系的 而且這種簡單工廠往往會違背開閉原則(如有錯誤 求拍磚!)
場景二,經濟社會:使用工具耕作
public class Hoe : ITool


Console.WriteLine("使用鋤頭");
public static class ToolFactory

/// 工廠制造工具

/// <returns></returns>

public static ITool CreateTool()

return new Hoe(); // 制造鋤頭
public class EconomyPerson : Person

/// 經濟社會使用鋤頭耕作


//不用知道什麼工具,隻需知道工廠能買到工具,而不自己制造工具,但僅由工廠制造鋤頭

ITool tool = ToolFactory.CreateTool();


Console.WriteLine("經濟社會使用工具耕作");
第三段 運用依賴注入
public class Computer : ITool


Console.WriteLine("使用電腦");
public class ModernPerson : Person

/// 從外部擷取工具
public ITool Tool { get; set; }


/// 現在人用不需要知道電腦是哪來的,直接拿來辦公


//不知道使用什麼工具和哪來的工具,隻是機械化的辦公

Tool.UseTool();

Console.WriteLine("使用工具辦公");
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="spring">
<section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core" />
<section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" />
</sectionGroup>
</configSections>
<spring>
<context>
<resource uri="config://spring/objects" />
</context>
<objects xmlns="http://www.springframework.net">
<description>一個簡單的控制反轉例子</description>
<object id="computer" type="SpringNetIoC.Computer, SpringNetIoC" />
<object id="modernPerson" type="SpringNetIoC.ModernPerson, SpringNetIoC">
<property name="Tool" ref="computer"/>
</object>
</objects>
</spring>
</configuration>
class Program

static void Main(string[] args)

IApplicationContext ctx = ContextRegistry.GetContext();

Person person = (Person)ctx.GetObject("modernPerson");

person.Work();


Console.ReadLine();
從上面代碼我們可以看出,把對象交給Spring.NET容器進行管理,ModernPerson類不需要知道具體使用什麼工具,僅僅是機械化的工作。至于使用的什麼工具,則由配置檔案決定,所有對象由Spring.NET容器管理,這樣可以實作動态的拆裝組建群組件重用。我個人了解依賴注入是反射工廠的加強版。